2012-09-26 15 views
8

Sto provando a selezionare più valori in una singola colonna. Fondamentalmente voglio la query per selezionare tutte le persone sotto la colonna family con i valori Software_1Y, XI_1Y e P1_1YCome seleziono più valori nella stessa colonna?

Sto facendo funzionare questa domanda:

SELECT `salesorder` 
    ,`masterproduct` 
    ,`family` 
    ,`birthstamp` 
    ,`duedate` 
    ,COUNT(*) AS `total` 
FROM `report` 
WHERE `birthstamp` BETWEEN '$startDT' 
     AND '$endDT' 
    AND `family` = 'Software_1Y' 
    AND `family = 'XI_1Y' 
    AND `family` = 'PI_1Y' 
GROUP BY `salesorder` 
    ,`masterproduct` 
    ,`family` 
    ,`duedate`; 

La mia domanda non restituisce alcuna riga, ma è che cerco ogni famiglia uno per uno , Ho dei valori

Cosa c'è di sbagliato nella mia richiesta?

Inoltre, il mio scopo è quello di ottenere tutte le righe i cui valori sono familySoftware_1Y, XI_1Y e PI_1Y.

+0

Usa 'IN' o cambia in' \ 'famiglia \' = 'Software_1Y' OR \ 'famiglia \' = 'XI_1Y' OR \ 'famiglia \' = 'PI_1Y'' – hjpotter92

+0

Correggetemi se sbaglio, ma se uso "OR", ho solo una riga singola, giusto? Il mio scopo è quello di ottenere tutte quelle file con quei valori 'family'. – Jude

risposta

10

Come sull'utilizzo IN invece

SELECT `salesorder`, 
     `masterproduct`, 
     `family`, 
     `birthstamp`, 
     `duedate`, 
     COUNT(*) AS `total` 
FROM `report` 
WHERE `birthstamp` BETWEEN '$startDT' AND '$endDT' 
AND  `family` IN ('Software_1Y','XI_1Y','PI_1Y') 
GROUP BY `salesorder`, 
      `masterproduct`, 
      `family`, 
      `duedate`; 

Il motivo per cui vengono restituiti senza valori, è a causa di questa sezione

AND `family` = 'Software_1Y' 
AND `family = 'XI_1Y' 
AND `family` = 'PI_1Y' 

family non possono essere tutti i 3 valori in una sola volta, ma potrebbe essere 1 dei 3 valori.

Ecco perché si utilizzerà IN.

Un altro modo di guardare sarebbe usare OR, ma questo si fa davvero a lungo.

+2

Ciò significa che c'era un errore nel tuo SQL. Non si verifica un errore da 'mysql_query'? Il messaggio di errore dovrebbe dirti dov'era il tuo errore. – Barmar

+0

Grazie @Barmar, ho visto il mio errore, uno stupido. Scusa: D haha ​​... – Jude

+0

Questa è di gran lunga la migliore spiegazione su questo tipo di query. Grazie astander –

1
$query=" SELECT `salesorder`,`masterproduct`,`family`,`birthstamp`,`duedate`, COUNT(*) AS `total` FROM `report` 
    WHERE `birthstamp` BETWEEN '$startDT' AND '$endDT' 
      AND (`family` = 'Software_1Y' 
      OR `family` = 'XI_1Y' 
      OR `family` = 'PI_1Y') 
    GROUP BY `salesorder`,`masterproduct`,`family`,`duedate` "; 

Deve essere dovuto a AND invece di OR durante l'interrogazione della colonna FAMIGLIA.

$result = mysql_query($query); 
while ($row = mysql_fetch_array($result)) 
{ 
//Operation you want to perform 
} 

@jude: Sembra che si sta passando direttamente l'interrogazione, che è di tipo stringa direttamente come parametro a mysql_fetch_array, che è sbagliato. Segui invece l'approccio sopra ...

+1

Probabilmente vorrai mettere alcune parentesi attorno agli OR ... AND ('family' = 'Software_1Y' OR 'family =' XI_1Y 'OR' family' =' PI_1Y ') –

+0

@astander: Sì ... mi è venuto in mente pure. Ma poi ho pensato che avrebbe davvero influenzato la condizione in questo caso particolare? –

+0

YES, sicuramente lo farebbe, in base all'ordine degli operatori sarebbe ('$ startDT' AND '$ endDT' AND 'family' = 'Software_1Y') O' family' = 'XI_1Y' OR 'family' = 'PI_1Y' –

Problemi correlati