2012-07-08 53 views
4

我試圖得到一個有點複雜的查詢工作,我沒有任何運氣。如何做最少每組查詢的左連接?

假設我有以下表格:

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  | 
+---------------------------------+ 

我遇到的麻煩是加入一定數量的電影價格。我根本無法弄清楚如何去做。

+0

請張貼你最接近的嘗試。否則這讀作爲doitforme.com請求。 – Randy 2012-07-08 18:33:34

+0

好的。我發佈的所有內容都被簡化了,但我會嘗試「移交」我目前的查詢。 – Nate 2012-07-08 18:36:49

+0

@Randy - 好的,我做到了。它沒有什麼意義,因爲t2.movi​​e_name也可以從cart_items中獲得,但正如我所提到的,這個例子是簡化的,所以我真的會從t2(電影)中獲得更多的信息。殘缺於我的部分是如何增加價格。 – Nate 2012-07-08 18:41:18

回答

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

問候。

+0

可能是可調的。 – Sebas 2012-07-08 21:11:28

+0

哇,這真的很複雜:-) – Nate 2012-07-10 21:51:55