我遇到了一个有趣的问题,但我不太确定如何解决它 - 因此我们开始吧。
假设我有一个表 A:列表和表 B:产品。列表和产品是两个独立的表,具有完全不同的列,并且具有自己的联接以将相关信息拉入其中。
相似之处在于两个表都有价格列,但在不同的列名称下维护此信息。 我想要做的是从两个表的组合数据集中提取 n 个最便宜的价格。
鉴于两个不同表的联接最终非常不同,我首先编写了两个不同的 SELECT 语句。然后,我对每个表的价格 ASC 进行排序,合并两个查询的结果,并再次按价格对结果数组进行排序。
这里的固有缺陷当然是来自每个 SELECT 语句的数据集对于它们自己的数据池来说是唯一的。简而言之,每个 SELECT 产生的价格排名仅适用于该特定数据集,但与两个表的整体组合结果进行比较时则不然。当您向数据集发出多个请求以取回分页行时,此问题会被放大。
考虑到使用两个单独查询的局限性,我认为唯一的解决方案是将查询编写为一个 SELECT,以便无论使用 LIMIT 还是查询数据库获取更多数据,数据集都保持不变。我很困惑如何编写一个查询来从两个完全不同的表中收集数据(同时将每个表连接到许多其他表)并在同一 SELECT 语句中的一列中比较它们。 p>
理想情况下会发生以下情况:
表 A:列表
- 第 1 行 - list 1 - 50 美元
- 第 2 行 - list 2 - 20 美元
- 第 3 行 - list 3 - 40 美元
表 B - 产品
- 第 1 行 - 商品 1 - 100 美元
- 第 2 行 - 第 2 项 - 300 美元
- 第 3 行 - 第 3 项 - 55 美元
- 第 4 行 - 第 4 项 - 1000 美元
第一次调用两个最便宜的价格只会拉回表 A 中的第 2 行和第 3 行。
下一次回调接下来两个最便宜价格的调用将从表 A 中拉出第 1 行,从表 B 中拉出第 3 行。
下一次调用将从表 B 中提取第 2 行和第 1 行。
最后,最后一次调用将从表 B 中提取第 4 行,并通知用户两个表之间不再有可提取的结果。
如果需要更多说明,请告诉我!
最佳答案
您似乎正在寻找UNION
运算符。您最终可能会编写如下查询:
SELECT
name,
price
FROM (
SELECT
listings.name AS name,
listings.price AS price
FROM
listings
[JOIN ...]
[WHERE ...]
ORDER BY
price
LIMIT 2
UNION ALL
SELECT
products.name AS name,
products.price AS price
FROM
products
[JOIN ...]
[WHERE ...]
ORDER BY
price
LIMIT 2
)
ORDER BY price
LIMIT 2
关于mysql - SQL - 排序/限制不同表中的相关信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26633778/