2012-12-26 18 views
24

Ho una tabella come questa:MySQL multipla Dove clausola

id image_id style_id style_value 
----------------------------------- 
1 45  24  red 
1 45  25  big 
1 47  26  small 
1 45  27  round 
1 49  28  rect 

voglio prendere colonna image_id se:

  • style_id = 24 e style_value = red
  • style_id = 25 e style_value = big
  • style_id = 26 e style_value = round

devo fare una query come questa:

$query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = 'red') AND (style_id = 25 AND style_value = 'big') AND (style_id = 27 AND style_value = 'round') 

Ma non ho potuto ottenere alcun risultato. Quando faccio questo esempio con OR, funziona bene. Ma devo farlo con AND. Perché ho bisogno di id di immagine che sono sia "rossi, grandi e retti".

Ho fatto molte ricerche con Google ma non ho potuto risolvere nessuna soluzione.

Grazie,

Have a nice lavoro.

+0

Esiste una dipendenza tra style_id e style_value? Cioè, style_id 24 significa "rosso", mentre style_id 25 significa "grande"? – mdoyle

+0

Sì, ho un'altra tabella denominata "stili". E uno stile ha 5-6 diverse opzioni. Ad esempio: style_id 24 ha 5 diverse opzioni (rosso, verde, giallo, ...). –

+0

Potete fornire un 'SHOW CREATE TABLE list \ G' e' SHOW CREATE TABLE styles \ G', e fornire anche alcune righe di esempio dagli 'stili' della tabella? – mdoyle

risposta

0

Questo potrebbe essere quello che stai cercando, anche se a seconda di quanti style_id ci sono, sarebbe difficile da implementare (non sono sicuro se quelli di style_id siano statici o meno). Se questo è il caso, quindi non è realmente possibile ciò che si desidera in quanto la clausola WHERE funziona su una riga per riga.

WITH cte as (
    SELECT 
    image_id, 
    max(decode(style_id,24,style_value)) AS style_colour, 
    max(decode(style_id,25,style_value)) AS style_size, 
    max(decode(style_id,27,style_value)) AS style_shape 
    FROM 
    list 
    GROUP BY 
    image_id 
) 
SELECT 
    image_id 
FROM 
    cte 
WHERE 
    style_colour = 'red' 
    and style_size = 'big' 
    and style_shape = 'round' 

http://sqlfiddle.com/#!4/fa5cf/18

+0

Ho provato in sqlfiddle, ma questi valori non sono statici. Quindi devo convertire in una versione dinamica. Se non riesco a trovare alcuna soluzione pratica, posso provare la soluzione. Grazie Lock. –

6

Lei non potrà mai ottenere un risultato, si tratta di un errore di logica semplice.

Stai chiedendo al tuo database di restituire una riga che ha style_id = 24 AND style_id = 25 AND style_id = 26. Poiché 24 è né 25 né 26, non otterrai alcun risultato.

Devi usare OR, quindi ha un senso.

+0

Ma, ci sono anche entrambi, image_id (45) => style_id (24), image_id (45) => style_id (25), image_id (45) => style_id (26) ... Significa che la tabella ha 3 righe diverse con lo stesso id_immagine. –

+0

Quindi dovresti controllare anche lo stesso image_id. Non sono abbastanza sicuro di quale sia lo scopo del tuo SQL. – akashivskyy

37

Penso che si sta dopo questa:

SELECT image_id 
FROM list 
WHERE (style_id, style_value) IN ((24,'red'),(25,'big'),(27,'round')) 
GROUP BY image_id 
HAVING count(distinct style_id, style_value)=3 

Non è possibile utilizzare e, perché i valori non possono essere 24 red e 25 big e 27 round allo stesso tempo nella stessa riga, ma è necessario verificare la presenza di style_id, style_value in più righe, sotto lo stesso image_id.

In questa query sto usando IN (che, in questo particolare esempio, è equivalente a un OR), e sto contando le righe distinte che corrispondono. Se 3 righe distinte corrispondono, significa che tutti e 3 gli attributi sono presenti per quello image_id e la mia query lo restituirà.

+0

Non sapevo che potessi raggruppare clausole del genere. Nifty. – erich2k8

9
SELECT a.image_id 
FROM list a 
INNER JOIN list b 
    ON a.image_id = b.image_id 
    AND b.style_id = 25 
    AND b.style_value = 'big' 
INNER JOIN list c 
    ON a.image_id = c.image_id 
    AND c.style_id = 27 
    AND c.style_value = 'round' 
WHERE a.style_id = 24 
    AND a.style_value = 'red' 
+0

grazie. Ecco di cosa ho bisogno. E 'fatto. Buon lavoro. –

0
select unique red24.image_id from 
( 
    select image_id from `list` where style_id = 24 and style_value = 'red' 
) red24 
inner join 
( 
    select image_id from `list` where style_id = 25 and style_value = 'big' 
) big25 
on red24.image_id = big25.image_id 
inner join 
( 
    select image_id from `list` where style_id = 27 and style_value = 'round' 
) round27 
on red24.image_id = round27.image_id 
+0

grazie. Il tuo codice funziona molto bene. Ho solo rimosso il parametro "unico" secondo le mie necessità. Tutto è ok adesso. Grazie ancora e buon lavoro. –

0

potrebbero utilizzare questa query non si ottiene alcun risultato o un risultato vuoto. Devi usare OR invece di AND nella tua query come di seguito.

$query = mysql_query("SELECT image_id FROM list WHERE (style_id = 24 AND style_value = 'red') OR (style_id = 25 AND style_value = 'big') OR (style_id = 27 AND style_value = 'round'); 

Prova questa query.