mysql - SQL - 排序/限制不同表中的相关信息

标签 mysql sql database relational-database

我遇到了一个有趣的问题,但我不太确定如何解决它 - 因此我们开始吧。

假设我有一个表 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/

相关文章:

mysql - 我将如何设计这个 MySQL 模式?

php - 隐私设置的数据库模式设计

mysql - 通过 MySQL 协议(protocol)连接到 Sphinx 时出错

python - 在 SQL/MySQL/PostgreSQL 表上执行高级数据清理和格式化的最佳语言/技术是什么?

sql - 在使用 GROUP_CONCAT 的查询中忽略 LIMIT

SQL:如何更新 ltree 中的值?

mysql - 运行 sql 查询时在运行时创建列

mysql - 使用 IF 语句根据 LEFT JOIN 获取所有字段

sql - 将 postgresql 数组解包成行

php - SQL错误(1064): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax