【问题标题】:How to combine two different mysql where clauses each results in 5 rows如何组合两个不同的mysql where子句每个结果为5行
【发布时间】:2023-03-29 23:22:01
【问题描述】:

我使用以下两个查询从每个查询中获取 5 行并显示在一个列表中。有没有可能组合两个查询的方法,这样我就不必单独运行它们。但是仍然得到相同的结果,首先是第一个 where 子句的结果,然后是第二个 where 子句的结果。

    SELECT *
    FROM
    institutes
    LEFT JOIN city ON institutes.city_id = city.city_id 
    LEFT JOIN district ON city.district_id = district.district_id 
    WHERE
    city.city_id = $current_city_id ORDER BY RAND() DESC LIMIT 5


    SELECT *
    FROM
    institutes
    LEFT JOIN city ON institutes.city_id = city.city_id 
    LEFT JOIN district ON city.district_id = district.district_id 
    WHERE
    district.district_id = $current_district_id ORDER BY RAND() DESC LIMIT 5 

【问题讨论】:

  • 为什么需要 2query?

标签: mysql select left-join union where-clause


【解决方案1】:

UNION ALL 与包装器SELECTs 一起使用:

SELECT * FROM (
    SELECT *
    FROM institutes
    LEFT JOIN city ON institutes.city_id = city.city_id 
    LEFT JOIN district ON city.district_id = district.district_id 
    WHERE city.city_id = $current_city_id
    ORDER BY RAND() DESC LIMIT 5
) x1
UNION ALL
SELECT * FROM (
    SELECT *
    FROM institutes
    LEFT JOIN city ON institutes.city_id = city.city_id 
    LEFT JOIN district ON city.district_id = district.district_id 
    WHERE district.district_id = $current_district_id
    ORDER BY RAND() DESC LIMIT 5 
) x2

需要包装器SELECTs,因为您不能将ORDER BY ... LIMITUNION 组合在同一级别,但您可以ORDER BY ... LIMIT 放入子查询。

需要UNION ALL 而不仅仅是UNION,因为UNION 会删除重复项,而您的问题需要保留重复项。

UNION ALL 也比UNION 快(因为它不需要重复数据删除,这通常需要排序),但在这种情况下,行数太少以至于不会注意到性能差异,但是在以后的应用中记住这一点是很好的。

【讨论】:

  • 请注意,每个子查询中都有一个多余的 LEFT JOIN
【解决方案2】:

我尝试了@Bohemian 的回答,但它对我不起作用。感谢他的简单解释,并按照link 进行操作,我能够想出下面对我有用的代码。但我不知道是否有办法可以摆脱代码中与左连接相关的冗余

sql = '(
  SELECT *
  FROM institutes
  LEFT JOIN city ON institutes.city_id = city.city_id 
  LEFT JOIN district ON city.district_id = district.district_id 
  WHERE city.city_id = $current_city_id
  )
  UNION
  (
  SELECT *
  FROM institutes
  LEFT JOIN city ON institutes.city_id = city.city_id 
  LEFT JOIN district ON city.district_id = district.district_id 
  WHERE district.district_id = $current_district_id
)
ORDER BY RAND() DESC LIMIT 10'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    相关资源
    最近更新 更多