2012-09-26 29 views
8

Tek bir sütunda birden çok değer seçmeye çalışıyorum.Aynı sütunda birden çok değeri nasıl seçerim?

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`; 

Benim sorgu hiçbir satır döndürür ama tek her ailenin bir tane arama edilmektedir: Temelde sorgu değerlerinin Software_1Y, XI_1Y ve P1_1Y

ben bu sorguyu çalıştırıyorum ile sütunda family altında tüm bu seçmek istediğiniz Değerlerim var.

Sorgumda sorun mu var?

Ayrıca, amacım olan family değerleri Software_1Y, XI_1Y ve PI_1Y olan tüm satırları elde etmektir.

+0

'IN' kullanın veya' \ 'familya \' = Software Software_1Y 'OR \ 'familya \' =' XI_1Y 'OR \ 'familya \' =' PI_1Y'' – hjpotter92

+0

Eğer yanılıyorsam düzeltin ama eğer 'OR' kullanırsam, o zaman sadece tek bir satır alırım? Amacım bütün bu satırları bu "aile" değerleri ile elde etmektir. – Jude

cevap

10

hiçbir değer döndürülür neden yerine

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`; 

nedeni İÇİNDE kullanma hakkında çünkü bu bölümün ne kadar

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

family kerede tüm 3 değerleri olamaz, ancak 1 olabilir 3 değerin

Bu yüzden IN'yi kullanırsınız.

Buna bakmanın bir başka yolu da OR kullanmaktır, ancak bu gerçekten çok uzun bir şekilde sarılır.

+2

Bu, SQL'inizde bir hata olduğu anlamına gelir. Mysql_query'den bir hata kontrol etmiyor musunuz? Hata mesajı, hatanın nerede olduğunu söylemelidir. – Barmar

+0

TeşekkürlerBarmar, hatamı gördüm, aptal bir tane. Üzgünüz: D haha ​​... – Jude

+0

Bu, bu tür sorguların en açık açıklamasıdır. Teşekkürler 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` "; 

dolayı hiç VE yerine VEYA AİLE sütununu sorgulanırken olmalıdır.

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

@jude: Bu doğrudan yanlıştır mysql_fetch_array için parametre olarak doğrudan dize türünde olduğu sorguyu geçiyoruz görünüyor. Bunun yerine, yukarıdaki yaklaşımı izleyin ...

+1

Muhtemelen OR'ların etrafında bazı köşeli parantezler koymak isteyeceksiniz ... VE ('aile' = 'Yazılım_1Y' VEYA 'aile =' XI_1Y 'VEYA' aile '=' PI_1Y ') –

+0

@astander: Evet ... aklıma da geldi. Ama sonra bu durumdaki durumu gerçekten etkileyeceğini düşündüm. –

+0

YEs, kesinlikle sahip olduğunuz gibi, operatörlerin sırası ('$ startDT' AND '$ endDT' AND 'family' = 'Software_1Y') OR 'ailesi' = 'XI_1Y' OR ailesi = 'PI_1Y' –

İlgili konular