正如您在上表中所见,我们有culture
个cultureid
个4
和5
。
每种文化都有一些相同的商店,有些商店有不同,即cultureid
4有一些cultureid
5没有商店。
我们如何提取culture
s中不相同的商店?
答案 0 :(得分:0)
首先,我认为您应该添加表格的架构,以便我们为您提供更好的答案。更多关于查询的屏幕截图和下面的结果不同,所以我们不太容易理解数据的确切结构。您在查询中遇到错误 - **c.**cultureid = **c.**cultureid
,我认为它应该是 s.cultureid = c.cultureid 。
但无论如何,如果我们认为您的 nl_stores 表格如下:
CREATE TABLE IF NOT EXISTS `nl_stores` (
cultureid INT(10) NOT NULL,
name VARCHAR(150) NOT NULL
) DEFAULT CHARSET=utf8;
意味着您有 cultureid 和名称字段,然后您可以使用此查询来查找您要查找的结果,使用HAVING方法:
SELECT cultureid, name FROM nl_stores GROUP BY name HAVING(COUNT(cultureid) = 1);
另一种方法是使用EXISTS statmant:
SELECT nl_stores.cultureid, nl_stores.name FROM nl_stores WHERE !EXISTS(SELECT 1 FROM nl_stores AS nl_stores_dummy WHERE nl_stores_dummy.name = nl_stores.name AND nl_stores_dummy.cultureid != nl_stores.cultureid);
当然你也可以使用JOIN实现它:
SELECT nl_stores.cultureid, nl_stores.name FROM nl_stores LEFT JOIN nl_stores AS nl_stores_dummy ON nl_stores_dummy.name = nl_stores.name WHERE nl_stores_dummy.cultureid IS NULL;
以下是基于您提供的数据的完整示例,我考虑以下数据库结构:
CREATE TABLE IF NOT EXISTS `nl_cultures` (
cultureid INT(10) NOT NULL,
culture_name VARCHAR(150) NOT NULL
) DEFAULT CHARSET=utf8;
INSERT INTO `nl_cultures` (`cultureid`, `culture_name`) VALUES
('4', 'Culture 1'),
('5', 'Culture 2');
CREATE TABLE IF NOT EXISTS `nl_stores` (
cultureid INT(10) NOT NULL,
name VARCHAR(150) NOT NULL,
`status` TINYINT(1) NOT NULL
) DEFAULT CHARSET=utf8;
查询可以是:
SELECT nl_cultures.culture_name, nl_stores.name AS store_name
FROM nl_cultures
INNER JOIN nl_stores ON nl_stores.cultureid = nl_cultures.cultureid
WHERE nl_stores.status = 1
GROUP BY nl_stores.name
HAVING(COUNT(nl_stores.cultureid) = 1);
通常JOIN语句执行速度最快,但它取决于您在表中的结果数量,基于我考虑使用GROUP的结果,它应该足够快并且无需任何额外的连接即可工作。 / p>
我根据自己的经验学习考虑的一些提示:
最好是不比较名称,但这些商店的ID会更快,更快,也可以更好地进行索引。如果它不是商店的ID,因为它们在不同的文化中是不同的,那么考虑为它们提供一些数字键来识别它们,无论文化如何都是一样的。
当您设置可理解/可读的表名并将其用作参考时,更容易理解和跟进查询。例如:store AS store_joined
而不是store AS s
,因为 s 是什么都没有,当你有一个很长的查询与几个连接时,可能很难区分所有这些和真的很容易跳过任何。对于列名称也是如此,最好将列字词与下划线分开,cultureid
,应为culture_id
。
还有一种方法是使用状态等特殊关键字作为列名来考虑不。如果您使用某种数据库工具,则可以更轻松地跟踪它。
最后一件事,根据您在屏幕截图中输入的查询,使用UPPER大小写字母作为sql关键字,更容易查看结构。
测试sql的一个很好的工具:http://sqlfiddle.com。
希望我有所帮助,如果您有任何疑问,请告诉我并在我的答案中投票给您:)。