2014-10-04 55 views
-1

假設我有兩個商店。 Store A(22)Store B(21)。這是獲取與該商店ID匹配的事物查詢:與多個狀態的左連接

SELECT c . * , s.s_name, s.logo, s.s_slug, cm.c_code, cm.c_shorturl, cm.c_shorturl_id 
FROM ci_cptbl c 
LEFT JOIN ci_stores s ON s.store_id = c.store_id 
LEFT JOIN ci_cptbl_mapper cm ON cm.c_id = c._id 
WHERE c.coupon_id <> '' 
AND c.store_id in ('22', '21') 
AND s.s_status = '1' 
AND c.c_status = '1' 
AND DATE(c.c_end_date) >= '2014-10-04' 
ORDER BY c.c_id DESC 

ci_cptbl擁有產品包括store_id的集合。並且ci_stores包含商店名稱等,包括s_status(0,1)。

CREATE TABLE `ci_stores` (
`store_id` int(10) NOT NULL AUTO_INCREMENT, 
`cat_id` int(10) NOT NULL, 
`s_name` varchar(255) NOT NULL, 
`s_slug` varchar(255) NOT NULL, 
`logo` varchar(255) NOT NULL, 
`display_name` varchar(255) NOT NULL, 
`s_description` text NOT NULL, 
`network_id` int(10) NOT NULL, 
`s_status` tinyint(1) NOT NULL DEFAULT '0', 
`merged_stores` text NOT NULL, 
`stat` bigint(20) NOT NULL, 
PRIMARY KEY (`store_id`), 
KEY `network_id` (`network_id`), 
KEY `cat_id` (`cat_id`), 
FULLTEXT KEY `display_name` (`display_name`) 
) ENGINE=MyISAM AUTO_INCREMENT=127 DEFAULT CHARSET=utf8 

Sample

現在的條件是我只有第一家店ID(22)啓用,其餘的被禁用(21,......)我在商店表,我AND s.s_status = '1'語句的工作只有當所有商店已啓用,但我希望所有商店,包括禁用。

但首先STORE ID必須啓用

回答

0

你可以試着改變你的測試狀態的STORE_ID並啓用

(c.c_status = '1' or c.store_id <> '22') 

這樣:

SELECT c . * , s.s_name, s.logo, s.s_slug, cm.c_code, cm.c_shorturl, cm.c_shorturl_id 
FROM ci_cptbl c 
LEFT JOIN ci_stores s ON s.store_id = c.store_id 
LEFT JOIN ci_cptbl_mapper cm ON cm.c_id = c._id 
WHERE c.coupon_id <> '' 
AND c.store_id in ('22', '21') 
AND s.s_status = '1' 
AND (c.c_status = '1' or c.store_id <> '22') 
AND DATE(c.c_end_date) >= '2014-10-04' 
ORDER BY c.c_id DESC 
0

您需要將您的「AND s.s_status = 1」子句添加到查詢的LEFT JOIN部分。當你將它移動到WHERE子句時,它強制爲一個隱含的INNER JOIN,從而離開你的結果集。

 LEFT JOIN ci_stores s 
     ON c.store_id = s.store_id 
     AND s.s_status = '1' 
+0

這就是我想要的,但問題是,如果我禁用兩者的門店狀況則仍它迴應結果,在這種情況下它不應該返回結果。 – 2014-10-06 04:20:16

0
FROM ci_cptbl c 
LEFT JOIN ci_stores s ON s.store_id = c.store_id 

LEFT JOIN的目的是允許在「接合到」,以在結果

例如列出表不匹配的記錄如果有一個店657 ci_cptbl但沒有這樣的店在ci_stores 657仍然會被上市

然而,使用WHERE clause

  • 然後如果我們還堅持每一行都有s.s_status =「1」
  • 然後存儲657將不被列入(如何呢?它不ci_stores存在,因此ci_storess_status必須是NULL,並且可以永遠等於1

所以;當使用任何外連接(如LEFT OUTER JOIN)時,必須非常小心如何引用WHERE clause中的這些表。在許多情況下,如在這裏,它是更好的附加條件(S)移動到JOIN這樣的:

FROM ci_cptbl c 
LEFT JOIN ci_stores s ON s.store_id = c.store_id 
         AND s.s_status = '1' 
+0

嗯,我一定是太慢了。 – 2014-10-04 12:59:24