2012-04-08 4 views
8

Ho una query SQL che parte da una tabella in modi diversi a seconda di una condizione.Come si utilizza un'istruzione IF in una query di join MySQL?

SELECT m.id, u.first_name AS otherUser 
FROM matches AS m 
IF (u.id=m.user2ID) 
    LEFT JOIN users AS u ON u.id = m.user1ID 
ELSE 
    LEFT JOIN users AS u ON u.id = m.user2ID 
ENDIF 
WHERE m.user1ID=2 OR m.user2ID=2 

matches è una tabella con le colonne integer user1ID e user2ID. users è una tabella contenente utenti della mia applicazione web. users ha un campo VARCHAR chiamato first_name.

L'intenzione di questa query è di ottenere i nomi degli utenti corrispondenti con l'utente corrente.

Tuttavia, MySQL restituisce questo errore:

#1064 - You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version for 
the right syntax to use near 'IF (u.id=m.user2ID) LEFT JOIN users 
AS u ON u.id = m.user1ID ELSE LEFT JOIN user' at line 3 

Perché?

risposta

0

In questo modo non è possibile utilizzare lo IF THEN ELSE END IF -stuff in un SELECT. Tuttavia, è possibile utilizzarlo nelle stored procedure e funzioni.

vorrei JOINu.id sia con m.user1ID e m.user2ID e utilizzare DISTINCT per evitare duplicati.

C'è uno IF() che è possibile utilizzare in SELECTs, ma non è possibile eseguire il controllo di flusso con IF().

3

utilizzare questa query:

SELECT m.id, u.first_name AS otherUser FROM matches AS m LEFT JOIN users AS u ON u.id = m.user1ID AND u.id=m.user2ID LEFT JOIN users AS u1 ON u1.id = m.user2ID WHERE m.user1ID=2 OR m.user2ID=2

interrogazione Aggiornato:

SELECT m.id, u.first_name AS otherUser 
FROM matches AS m 
LEFT JOIN users AS u ON u.id = (CASE WHEN u.id=m.user2ID 
            THEN m.user1ID 
            ELSE m.user2ID 
           END) 
WHERE m.user1ID=2 OR m.user2ID=2 

Controllare questo Source.

Controllare anche questo MYSQL Inner Join if statement. Potrebbe essere utile per te.

+0

Grazie, questa query sta generando il giusto numero di risultati, ma stranamente restituisce NULL per tutti i valori nella colonna otherUser. Sembra non rilevare i nomi dei primi utenti, come mostrato qui http://goo.gl/jg7xp –

8

specificare la condizione come parte della clausola ON:

SELECT m.id, u.first_name AS otherUser 
FROM matches AS m 
LEFT JOIN users AS u ON (u.id=m.user2ID and u.id = m.user1ID) or (u.id<>m.user2ID and u.id = m.user2ID) 
WHERE m.user1ID=2 OR m.user2ID=2 

Un altro modo per fare la stessa cosa:

SELECT m.id, u.first_name AS otherUser 
FROM matches AS m 
LEFT JOIN users AS u ON IF(u.id=m.user2ID,u.id = m.user1ID,u.id = m.user2ID) 
WHERE m.user1ID=2 OR m.user2ID=2 
+0

Grazie, queste due query stanno generando il giusto numero di risultati, ma stranamente restituendo NULL per tutti i valori nel ' colonna Altro utente ». Sembra non rilevare i nomi dei primi utenti, come mostrato qui http://goo.gl/jg7xp –

+0

è un SINISTRA ESTERNO SINISTRO quindi sembra che la condizione non sia soddisfatta per nessuna riga. Ho semplicemente copiato le condizioni dalla tua query originale. In un secondo momento, vedo qualcosa di sbagliato nelle condizioni: u.id <> m.user2ID e u.id = m.user2ID. Ora non sarebbe mai vero! Anche l'altra condizione è improbabile, sebbene non impossibile. Si prega di verificare nuovamente le condizioni. Basta usare questa risposta come modello e inserire le condizioni corrette. – Dojo

+0

Se la query funziona con le condizioni modificate, modificare la mia risposta e modificare le condizioni a beneficio di chi capita di leggere più tardi – Dojo

0

Grazie, Ha funzionato per me. qualcosa di provato altro, come di seguito:

**

Create table TEMP1 (ID INT,T_MONTH INT,T_YEAR INT) 
INSERT INTO TEMP1 VALUES(1,1,2001) 
INSERT INTO TEMP1 VALUES(2,2,2001) 
INSERT INTO TEMP1 VALUES(3,3,2001) 

**

CREATE TABLE TEMP2 (T_MONTH INT,T_YEAR INT,FREQUENCY CHAR(1),VAL FLOAT) 
INSERT INTO TEMP2 VALUES(1,2001,'M',1.1) 
INSERT INTO TEMP2 VALUES(3,2001,'M',1.2) 
INSERT INTO TEMP2 VALUES(3,2001,'Q',1.3) 
INSERT INTO TEMP2 VALUES(12,2001,'A',1.4) 

SELECT * FROM TEMP1 L JOIN TEMP2 H 
ON L.T_YEAR = H.T_YEAR 
OR (L.T_MONTH = (CASE WHEN H.FREQUENCY='M' 
         THEN H.T_MONTH 
        END) 
    OR dbo.GetQuarterFromMonth(L.T_MONTH) = (CASE WHEN H.FREQUENCY = 'Q' 
         THEN dbo.GetQuarterFromMonth(H.T_MONTH) 
         END)) 
WHERE H.FREQUENCY = 'Q' 

Ecco GetQuarterFromMonth è un funtion definita dall'utente che restituisce quartiere per un determinato mese.

L'obiettivo della query precedente è di gonfiare il valore di Quarter per tutti i mesi nella tabella 1. Se la frequenza è annuale, in tal caso il valore deve essere gonfiato per tutti i mesi 1-12 della tabella 1 che viene raggiunto attraverso la prima condizione di join. Nel caso in cui la frequenza sia mensile, ogni mese dalla tabella 1 deve essere mappato a table2. L'unico caso unico è la gestione della frequenza trimestrale.

Problemi correlati