假设我有两家商店。 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
现在条件是我在我的商店表中只启用了第一个商店ID(22
)并且休息被禁用(21,.....)而且我的AND s.s_status = '1'
语句仅在所有商店已启用,但我想要所有商店,包括残疾人。
但必须启用第一个商店ID
答案 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
:
ci_stores
中不存在ci_stores
s_status
。LEFT 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}}