如何组合两个不同的 mysql where 子句,每个子句产生 5 行
How to combine two different mysql where clauses each results in 5 rows
我使用以下两个查询从每个查询中获取 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
将 UNION ALL
与包装器一起使用 SELECT
s:
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
包装器 SELECT
是必需的,因为您不能在同一级别组合 ORDER BY ... LIMIT
和 UNION
,但 可以 将 ORDER BY ... LIMIT
放入 子查询 .
需要 UNION ALL
而不仅仅是 UNION
,因为 UNION
删除了重复项,而您的问题需要保留重复项。
UNION ALL
也比 UNION
快(因为它不需要重复数据删除,这通常需要排序),但在这种情况下,行数太少,性能差异不大不会被注意到,但在以后的应用中记住这一点是很好的。
我尝试了@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'
我使用以下两个查询从每个查询中获取 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
将 UNION ALL
与包装器一起使用 SELECT
s:
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
包装器 SELECT
是必需的,因为您不能在同一级别组合 ORDER BY ... LIMIT
和 UNION
,但 可以 将 ORDER BY ... LIMIT
放入 子查询 .
UNION ALL
而不仅仅是 UNION
,因为 UNION
删除了重复项,而您的问题需要保留重复项。
UNION ALL
也比 UNION
快(因为它不需要重复数据删除,这通常需要排序),但在这种情况下,行数太少,性能差异不大不会被注意到,但在以后的应用中记住这一点是很好的。
我尝试了@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'