2012-09-26 33 views
8

Tôi đang cố gắng chọn nhiều giá trị trong một cột. Về cơ bản tôi muốn truy vấn để chọn tất cả những người dưới cột family với các giá trị Software_1Y, XI_1YP1_1YLàm cách nào để chọn nhiều giá trị trong cùng một cột?

Tôi đang chạy truy vấn này:

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

truy vấn của tôi trả về không có hàng nhưng tôi tìm kiếm mỗi gia đình từng người một , Tôi có giá trị.

Có gì sai với truy vấn của tôi?

Ngoài ra, mục đích của tôi là nhận tất cả các hàng có giá trị familySoftware_1Y, XI_1YPI_1Y.

+0

Sử dụng 'IN' hoặc thay đổi thành' \ 'family \' = 'Software_1Y' OR \ 'family \' = 'XI_1Y' OR \ 'family \' = 'PI_1Y'' – hjpotter92

+0

Đúng nếu tôi sai nhưng nếu tôi sử dụng 'OR' thì tôi chỉ nhận được một hàng đơn? Mục đích của tôi là để có được tất cả những hàng đó với những giá trị 'gia đình' đó. – Jude

Trả lời

10

Làm thế nào về việc sử dụng TRÊN thay

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

Lý do tại sao không có giá trị được trả về, là vì phần này

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

family không thể tất cả 3 giá trị cùng một lúc, nhưng nó có thể là 1 của 3 giá trị.

Đó là lý do bạn sử dụng IN.

Một cách khác để xem xét nó là sử dụng OR, nhưng điều đó thực sự kéo dài.

+2

Điều đó có nghĩa là đã xảy ra lỗi trong SQL của bạn. Bạn không kiểm tra lỗi từ 'mysql_query'? Thông báo lỗi sẽ cho bạn biết sai lầm của bạn ở đâu. – Barmar

+0

Cảm ơn @Barmar, đã thấy sai lầm của tôi, một câm. Xin lỗi: D haha ​​... – Jude

+0

Đây là giải thích tốt nhất cho loại truy vấn này. Cảm ơn người đọc –

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

Phải do AND thay vì HOẶC khi truy vấn cột GIA ĐÌNH.

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

@jude: Dường như bạn đang trực tiếp chuyển truy vấn thuộc loại chuỗi trực tiếp dưới dạng tham số tới mysql_fetch_array, điều đó sai. Thay vào đó, hãy làm theo cách tiếp cận trên ...

+1

Bạn có thể muốn đặt một số dấu ngoặc quanh ORs ... AND ('family' = 'Software_1Y' HOẶC' family = 'XI_1Y' HOẶC 'family' = 'PI_1Y') –

+0

@astander: Yeah ... nó cũng xuất hiện trong đầu tôi. Nhưng sau đó tôi nghĩ nó sẽ thực sự ảnh hưởng đến tình trạng trong trường hợp đặc biệt này? –

+0

YE, nó chắc chắn sẽ, như bạn có nó thứ tự của các nhà khai thác sẽ là ('$ startDT' AND '$ endDT' AND 'family' = 'Software_1Y') HOẶC' family' = 'XI_1Y' HOẶC 'family' = 'PI_1Y' –

Các vấn đề liên quan