【问题标题】:MySQL returning not returning all the recordsMySQL返回不返回所有记录
【发布时间】:2019-05-26 20:41:49
【问题描述】:

下面列出了两个表:-

  1. 足球 - 它有 2267 条独特的记录。
  2. football_assets - 它有 2716 条独特的记录。

现在我在 phpmyadmin 中运行以下 mysql 查询:-

select * from football_assets where pair in (SELECT DISTINCT pair FROM `football`);

查询只返回 2191 名玩家,但它应该提供 2267 条记录。我想知道为什么??

提前致谢。

【问题讨论】:

  • 为什么要给2267条记录?很明显, football_assets/football 中没有 2267 个匹配对。
  • SELECT DISTINCT pair FROM football`` 将返回 2716 对,当我检查 pair in 时,它会找到这 2267 对的匹配项......对吗??
  • 错了。它可以返回的最大记录是 football_assets 中的所有记录。如果它返回较少,则并非所有记录都配对。顺便说一句,就问题中的数字而言,您的最后一条评论与问题相反。
  • @P.Salmon 请解释我的问题的答案....谢谢

标签: mysql sql xampp


【解决方案1】:

您得到的结果表明, football_assets 中有 2267-2191 = 76 条记录,它们在 Football 中找不到。

您可以通过将查询中的 IN 更改为 NOT IN 来展示这些记录:

SELECT * 
FROM football_assets 
WHERE pair NOT IN (
    SELECT DISTINCT pair FROM `football`
);

【讨论】:

    【解决方案2】:

    首先,select distinct 在子查询中是多余的。 WHERE 子句不会更改行数。所以,你应该写:

    select fa.*
    from football_assets fa
    where fa.pair in (select f.pair from football f);
    

    显然,您有一些对不在两个表中。我强烈建议您使用not existsleft join/where 来查找它们:

    select fa.*
    from football_assets fa
    where not exists (select 1 from football f where fa.pair = f.pair);
    

    不要使用not in。即使pair 的单个值在football 中是NULL,它也不会返回任何行。这是因为NULLs 在 SQL 中的工作方式。因此,我强烈反对 not in 使用子查询。

    【讨论】:

      猜你喜欢
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多