2014-10-04 54 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