SQL - 来自不同表的排序/限制相关信息

时间:2014-10-29 15:02:35

标签: mysql sql database relational-database

我遇到了一个有趣的问题,我不太清楚如何解决它 - 因此我们走了。

假设我有一个表A:LISTINGS 和一个表B:产品。清单和产品是两个独立的表,具有完全不同的列,并且具有自己的连接以向其提取相关信息。

相似之处在于两个表都有价格列,但在不同的列名下维护此信息。 我想要做的是从两个表格的合并数据集中撤回一些最便宜的价格。

鉴于两个不同表的连接最终非常不同,我开始编写两个不同的SELECT语句。然后我为每个表订购了ASC的价格,合并了两个查询的结果,并再次按价格对结果数组进行了排序。

这里固有的缺陷当然是来自每个SELECT语句的数据集对于它们自己的数据池是唯一的。简而言之,每个SELECT的最终价格等级仅适用于该特定数据集,但与两个表格的总体结果相比较时则不然。当您向数据集发出多个请求以获取分页行时,此问题会被放大。

鉴于使用两个单独查询的限制,我认为唯一的解决方案是将查询编写为一个SELECT,以便数据集保持不变,无论使用LIMIT还是查询数据库以获取更多数据。我很难理解如何编写一个单独的查询,从两个完全不同的表中收集数据( all,同时连接许多其他表上的每个表)并在同一个SELECT语句中的一列中进行比较。

理想情况下会发生以下情况:

表A:列表

  • 第1行 - 清单1 - $ 50
  • 第2行 - 清单2 - $ 20
  • 第3行 - 清单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行 ,并通知用户在两个表之间没有更多结果可以撤回。

如果有任何需要进一步澄清,请告诉我!

1 个答案:

答案 0 :(得分:1)

您似乎在寻找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