【问题标题】:How to fix inconsistent mysql results?如何修复不一致的mysql结果?
【发布时间】:2021-11-29 13:45:19
【问题描述】:

我的MySQL 查询

(SELECT * FROM names WHERE Rate = 75 ORDER BY RAND() LIMIT 1) 
UNION 
(SELECT * FROM names WHERE Rate = 75 ORDER BY RAND() LIMIT 1) 
UNION 
(SELECT * FROM names  WHERE Rate = 35 ORDER BY RAND() LIMIT 1);

它应该给我这样的东西

+----+-----+------+
| id | Rate| num  |
+----+-----+------+
| id |  75 |  987 |
| id |  75 |  987 |
| id |  35 |  987 |
+- --+-----+------+

但有时它只给我 2 行,像这样

+----+-----+------+
| id | Rate| num  |
+----+-----+------+
| id |  75 |  987 |
| id |  35 |  987 |
+- --+-----+------+

【问题讨论】:

    标签: mysql sql-order-by union union-all sql-limit


    【解决方案1】:

    注意UNIONUNION ALL之间的区别

    • UNION 将删除重复的行
    • UNION ALL 保留所有行

    【讨论】:

    • 哦好的好的,谢谢你的回答!
    • @Jimboy,如果它解决了您的问题,您应该标记为已接受并为答案投票
    【解决方案2】:

    UNION 删除重复行。

    前 2 个查询可能返回同一行,在这种情况下,其中一个只会出现在结果中。

    如果您不介意结果中有重复行,请更改为 UNION ALL:

    (SELECT * FROM names WHERE Rate = 75 ORDER BY RAND() LIMIT 1) 
    UNION ALL 
    (SELECT * FROM names WHERE Rate = 75 ORDER BY RAND() LIMIT 1) 
    UNION ALL
    (SELECT * FROM names WHERE Rate = 35 ORDER BY RAND() LIMIT 1);
    

    如果您想要唯一的行,则使用 LIMIT 2 将前 2 个查询统一为仅 1 个,以便它们返回 2 行:

    (SELECT * FROM names WHERE Rate = 75 ORDER BY RAND() LIMIT 2) 
    UNION ALL 
    (SELECT * FROM names WHERE Rate = 35 ORDER BY RAND() LIMIT 1);
    

    我在这里使用UNION ALL,因为它的性能优于UNION

    【讨论】:

      【解决方案3】:

      要从表中获取 3 个不同行,只需:

      SELECT * FROM names WHERE Rate = 35 ORDER BY RAND() LIMIT 3;
      

      【讨论】:

      • 要求是 2 行,Rate = 75,1 行,Rate = 35。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-13
      • 2014-09-21
      • 1970-01-01
      • 2018-10-31
      相关资源
      最近更新 更多