如何比较两个mysql行ID并提取未包含的存储

如何比较两个mysql行ID并提取未包含的存储,mysql,Mysql,正如您在上表中所看到的,我们有两个cultures,其中cultureids为4和5 每个区域性都有一些相同的存储,而有些则不同,即cultureid4有一些cultureid5没有的存储 如何提取两种文化中不同的存储?首先,我认为您应该添加表的模式,以便我们能够为您提供更好的答案。更多关于查询的屏幕截图和下面的结果不同,因此我们不太容易理解数据的确切结构。查询中有一个错误-**c.*cultureid=**c.*cultureid,我认为应该是s.cultureid=c.cultureid 但

正如您在上表中所看到的,我们有两个
culture
s,其中
cultureid
s为
4
5

每个区域性都有一些相同的存储,而有些则不同,即
cultureid
4有一些
cultureid
5没有的存储


如何提取两种文化中不同的存储?

首先,我认为您应该添加表的模式,以便我们能够为您提供更好的答案。更多关于查询的屏幕截图和下面的结果不同,因此我们不太容易理解数据的确切结构。查询中有一个错误-
**c.*cultureid=**c.*cultureid
,我认为应该是s.cultureid=c.cultureid

但是,如果我们认为你的<强> nLySturt表是这样的:

CREATE TABLE IF NOT EXISTS `nl_stores` (
  cultureid INT(10) NOT NULL,
  name VARCHAR(150) NOT NULL
) DEFAULT CHARSET=utf8;
这意味着您在其中有cultureidname字段,然后您可以使用此查询来查找您正在查找的结果,使用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);
当然,您也可以通过连接来实现:

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;

这里是一个完整的例子,基于您提供的数据,我考虑下面的DB结构:

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);

通常,联接语句将是执行最快的,但这取决于表中的结果量,基于我将考虑使用该组的速度,它应该足够快,并且不需要任何额外的连接。 我从我的经验中学到的一些小窍门:

  • 最好不要比较那些商店的名称,但是比较它们的ID,这样会快得多,快得多,索引也会好得多。如果它不是商店的ID,因为它们在不同的文化中是不同的,那么考虑给它们提供一些“强>数字< /强>键,它们标识它们,无论文化如何,都是相同的。

  • 另外,当您设置可理解/可读的表名并将其用作引用时,理解和跟踪查询会容易得多。例如:
    store AS store\u joined
    而不是
    store AS s
    ,因为s什么都不是,当您有一个包含两个连接的很长的查询时,可能很难区分所有连接,并且很容易跳过任何连接。列名也是如此,而且最好用下划线分隔列单词,
    cultureid
    ,应该是
    culture\u id

  • >P>另一种方法是考虑<强>不>强>使用特殊的关键字,如<强>状态> /强>作为列名。如果您使用某种DB工具,那么跟踪它会更容易

  • 最后一件事,根据您在屏幕截图中键入的查询,sql关键字使用大写字母,这样更易于查看结构

一个测试sql的好工具:


希望我能为您提供帮助,如果您有任何问题,请让我知道并投票表决我的答案,如果它对您有效:)。

见您问题模糊!请给出不同表的结构、示例和预期数据,可能是您尝试过的查询。这样我们可以很容易地帮助你。嗨,斯维托斯拉夫,让我更具体地说。。。对于某些国家,我们目前有两种文化。例如比利时,我们有两种文化NL-BE和FR-BE。我们可以在FR-BE中添加所有NL-BE存储,反之亦然。我们想看看NL-BE上没有添加哪些商店。实际上,我们想要比较两种文化中具有相同商店的文化,我们想要得到两种文化中不相似的商店。哪家商店在哪种文化中可用。您好,关于使用文化,您已经有了工具,我已经为您提供了sql查询。您在最初的请求中没有提出任何关于国家的建议。但是不管怎样,如果你正在使用文化,你已经有了工具,我已经为你提供了查询,所以你可以根据你最初的请求得到文化中不相似的商店。只要稍加修改,您就可以得到同时具有两种文化的商店。你必须建立一个收集商店和文化的精选商店,非常简单。我可以帮你做任何一件事,但它们是完全不同的主题,正如我所说的,你需要提供更多的信息来提供帮助,表模式,请求。最后一件事,请接受/标记我的答案,如果它对你最初的问题有帮助的话。先谢谢你。