左连接具有多个状态

时间:2014-10-04 12:02:45

标签: mysql left-join

假设我有两家商店。 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'语句仅在所有商店已启用,但我想要所有商店,包括残疾人。

但必须启用第一个商店ID

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

你需要移动你的&#34; AND s.s_status = 1&#34;您查询的LEFT JOIN部分的子句。当您将其移动到WHERE子句时,它会强制进入隐含的INNER JOIN,从而将结果集排除在外。

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

答案 2 :(得分:0)

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

LEFT JOIN的目的是允许“加入”表中不匹配的记录列在结果中

e.g。如果ci_cptbl中有商店657,但ci_stores 657中的商店仍未列出

但是,使用WHERE clause

  • 如果我们然后坚持每行都有s.s_status ='1'
  • 然后不会列出商店657(它怎么样?ci_stores中不存在ci_stores s_statusLEFT OUTER JOIN 必须为空并且可以永远不会等于1

因此;当使用任何外部联接(例如WHERE clause)时,您必须非常小心地在JOIN中引用这些表。在许多情况下,例如在这里,最好将附加条件移动到FROM ci_cptbl c LEFT JOIN ci_stores s ON s.store_id = c.store_id AND s.s_status = '1' ,如下所示:

{{1}}