如何比较两个mysql行id和提取不包括的商店

时间:2018-02-23 06:53:08

标签: mysql

Table Structure

正如您在上表中所见,我们有culturecultureid45

每种文化都有一些相同的商店,有些商店有不同,即cultureid 4有一些cultureid 5没有商店。

我们如何提取culture s中不相同的商店?

1 个答案:

答案 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

希望我有所帮助,如果您有任何疑问,请告诉我并在我的答案中投票给您:)。