【问题标题】:How to do left joins with least-n-per-group query?如何使用每组最少 n 个查询进行左连接?
【发布时间】:2012-07-08 06:52:51
【问题描述】:

我试图让一个有点复杂的查询工作,但没有任何运气。

假设我有以下表格:

cart_items:

+--------------------------------------------+
| item_id  | cart_id | movie_name | quantity |
+--------------------------------------------+
|     0    |    0    | braveheart |    4     |
|     1    |    0    | braveheart |    9     |
|     .    |    .    |      .     |    .     |
|     .    |    .    |      .     |    .     |
|     .    |    .    |      .     |    .     |
|     .    |    .    |      .     |    .     |
+--------------------------------------------+

电影:

+------------------------------+
| movie_id  | movie_name | ... |
+------------------------------+
|     0     | braveheart |  .  |
|     .     |     .      |  .  |
|     .     |     .      |  .  |
|     .     |     .      |  .  |
|     .     |     .      |  .  |
+------------------------------+

定价:

+-----------------------------------------+
| id  | movie_name | quantity | price_per |
+-----------------------------------------+
|  0  | braveheart |    1     |   1.99    |
|  1  | braveheart |    2     |   1.50    |
|  2  | braveheart |    4     |   1.25    |
|  3  | braveheart |    8     |   1.00    |
|  .  |      .     |    .     |     .     |
|  .  |      .     |    .     |     .     |
|  .  |      .     |    .     |     .     |
|  .  |      .     |    .     |     .     |
|  .  |      .     |    .     |     .     |
+-----------------------------------------+


我需要加入表中的数据,但增加了复杂性,我需要从pricing 表中获取适当的price_per。每个cart_item 只能返回一个价格,这应该是pricing 表中的最低价格,其中购物车项目的quantity 至少是pricing 表中的数量。

因此,查询应为cart_items 中的每个项目返回以下内容:

+---------------------------------------------+
| item_id | movie_name | quantity | price_per |
+---------------------------------------------+


示例 1:

传递给查询的变量:cart_id = 0。返回:

+---------------------------------------------+
| item_id | movie_name | quantity | price_per |
+---------------------------------------------+
|    0    | braveheart |    4     |   1.25    |
|    1    | braveheart |    9     |   1.00    |
+---------------------------------------------+


请注意,这是一个极简示例,将从提到的表(尤其是电影表)中提取额外数据。

如何组成这个查询?我曾尝试使用左连接和子查询,但困难的部分是获得价格,而我尝试过的任何方法都没有奏效。

感谢您的帮助。

编辑:

我认为这类似于我使用“真实”表所做的工作:

SELECT t1.item_id, t2.movie_name, t1.quantity
FROM cart_items t1
LEFT JOIN movies t2 ON t2.movie_name = t1.movie_name
WHERE t1.cart_id = 0

假设我写的正确(我很快尝试“移植”我的真实查询),那么当前的输出将是:

+---------------------------------+
| item_id | movie_name | quantity |
+---------------------------------+
|    0    | braveheart |    4     |
|    1    | braveheart |    9     |
+---------------------------------+

我遇到的麻烦是以一定数量的电影加入价格。我根本不知道该怎么做。

【问题讨论】:

  • 请发布您最接近的尝试。否则这读作 doitforme.com 请求。
  • 好的。我发布的所有内容都经过简化,但我会尝试“移植”我当前的查询。
  • @Randy - 好的,我做到了。这实际上没有任何意义,因为 t2.movi​​e_name 也可以从 cart_items 中获取,但正如我提到的,这个示例已简化,因此我真的会从 t2(电影)中获取更多信息。难倒我的部分是如何添加价格。
  • @Randy - 顺便说一下,我不认为这是 doitforme.com 的请求,因为我已经连续两个多小时试图让它工作。
  • 我不怀疑你——但是太多的帖子读起来就像一个不费吹灰之力的家庭作业。很高兴你编辑了——看起来它对答案有帮助。

标签: php mysql database greatest-n-per-group


【解决方案1】:
SELECT t1.item_id, t1.movie_name, t1.quantity, t2.price_per
FROM cart_items t1
        INNER JOIN (
            SELECT c.quantity, c.movie_name, IF(p.price_per IS NOT NULL, MAX(p.price_per), MIN(p2.price_per)) AS `price_per`
            FROM cart_items c
                LEFT JOIN pricing p 
                    ON p.movie_name = c.movie_name 
                    AND p.quantity >= c.quantity
                LEFT JOIN pricing p2
                    ON p2.movie_name = c.movie_name 
                    AND p2.quantity < c.quantity
            GROUP BY c.quantity, c.movie_name
        ) t2 ON t2.movie_name = t1.movie_name AND t2.quantity = t1.quantity

小提琴:http://sqlfiddle.com/#!2/072e8

问候。

【讨论】:

  • 哇,这真的很复杂:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 1970-01-01
  • 1970-01-01
  • 2015-11-30
  • 1970-01-01
  • 2022-01-05
  • 2022-01-14
相关资源
最近更新 更多