2012-04-02 14 views
14

Ho le seguenti tabelle:MySQL sinistra dove table2.field = "X"

pagine:

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| page_id | int(11)  | NO | PRI | NULL | auto_increment | 
| type  | varchar(20) | NO |  | NULL |    | 
| categories | varchar(255) | NO |  | NULL |    | 
| title  | varchar(255) | NO | MUL | NULL |    | 
| text  | longtext  | NO | MUL | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

personalizzato:

+---------+------------------+------+-----+---------+-------+ 
| Field | Type    | Null | Key | Default | Extra | 
+---------+------------------+------+-----+---------+-------+ 
| page_id | int(10) unsigned | NO | PRI | NULL |  | 
| key  | varchar(255)  | NO | PRI | NULL |  | 
| value | longtext   | NO |  | NULL |  | 
+---------+------------------+------+-----+---------+-------+ 

Voglio unirmi le tabelle in un modo in cui:
1) tutte le voci dalla prima tabella sono r eturned LEFT JOIN custom ON pages.page_id = custom.page_id
2) pages.type IN ('type_a', 'type_b', 'type_c')
3) "key" dalla seconda tabella ha valore "utili" custom.key = 'votes'

feci tutto finora, ma la terza condizione è il problema. Se non c'è una voce per key = 'votes' nella tabella personalizzata, la query restituisce solo questi con le voci. Voglio restituire NULL se mancano le voci.

ho bisogno key = 'votes', perché ho altre voci di questo page_id dove la chiave non e 'voti' e questo duplica le righe da pagine

risposta

23

semplicemente aggiungere il tuo contraint custom.key='votes' al LEFT JOIN

SELECT * 
FROM pages LEFT JOIN custom 
    ON pages.page_id=custom.page_id AND custom.key='votes' 
WHERE pages.type IN('type_a','type_b','type_c') ; 
+0

Strano. Ho provato questo e non ha funzionato. L'ho ri-provato ora e ha funzionato. Probabilmente ho incasinato qualcosa. Grazie per la tua risposta! –

+0

Questo non ha funzionato per me etere. Potrebbe essere la versione mysql? – amilaishere

1

prova a cambiare la tua condizione where in custom.key = 'voti' OPPURE custom.key è nullo.

3

lo farei in questo modo:

SELECT * 
FROM pages 
LEFT JOIN 
    (SELECT * From custom where key='votes') cv 
    on pages.page_id = cv.page_id 
WHERE pages.type IN ('type_a', 'type_b', 'type_c');