2012-02-19 40 views
0

假設我有以下兩個表:整蠱:LEFT JOIN與行值關係

PRICE 
price_id price  room_id  nr_of_people 
1   80   1   1 
2   75   1   2 
3   90   2   2 
4   120   3   3 


ROOM 
room_id  room_no  max_people 
1   101   2 
2   102   3 
3   103   4 

而且,我需要以下結果:

QUERY_RESULT 
price  room_no  nr_of_people 
80   101   1 
75   101   2 
0   102   1 
90   102   2 
0   102   3 
0   103   1 
0   103   2 
120   103   3 
0   103   4 

在這裏是最棘手的部分,我需要爲每個人檢索價格(對於2人,對於3人,對於4人,這是遞增到在房間表中定義的max_people),如果在價格表中沒有可用的實際數據,則應該填入0默認。上圖應支持我的解釋。

我不知道表的結構是否有任何邏輯上的錯誤。

關於如何解決這個問題的任何想法/輸入/幫助深表感謝。

+0

什麼你使用的是當前的SQL語句嗎? – FluffyKitten 2012-02-19 16:45:58

+0

這是我實際在我的數據庫中的一個非常簡化的子集。這是酒店預訂應用程序的一部分,我使用數據透視表數據網格爲每個房間定義不同參數的價格。所以,真的不能提供任何實際的查詢這部分,因爲我目前沒有。 – code90 2012-02-19 17:04:16

+0

我明白,code90,但如果你不能給你查詢的一個實際的例子,那麼我們不能提供一個切實可行的解決方案:-) – FluffyKitten 2012-02-19 17:08:29

回答

1

正如abresas的答案和xQbert的評論所暗示的那樣,您不知何故需要創建數據才能將其與表格結合使用。

就像abresas的答案一樣,我使用輔助表格,但在我的解決方案中,此表格只需填寫1到N的數字,其中N =在列max_people上可能出現的最大值。

我創建了一個與單個列num稱爲aux輔助表。此查詢的工作對我來說:

SELECT IF(price.price IS NULL, 0, price.price) AS price, room.room_no, aux.num AS nr_of_people 
FROM room 
JOIN aux ON aux.num <= room.max_people 
LEFT JOIN price ON (price.room_id = room.room_id 
AND aux.num = price.nr_of_people) 
ORDER BY room.room_id, num 

不幸的是,MySQL不提供原生機制來生成一個整數(見thesequestions)的序列,所以物理創建輔助表似乎達到最實用的方法你需要什麼,儘管如果你真的不能或不想創建這樣的表格,解決方法肯定存在。

只是爲了好玩,下面會不會產生一個新的工作表中(所有靈感的問題,我掛):

SELECT [...] 
FROM room 
JOIN (
    SELECT 1 num 
    UNION SELECT 2 
    UNION SELECT 3 
    UNION SELECT 4 
    -- ...add as many entries as needed... 
) aux ON aux.num <= room.max_people 
LEFT JOIN [...] 

除了這一點:

SELECT [...] 
FROM room 
JOIN (
    SELECT @row := @row +1 AS num 
    FROM any_table_that_is_big_enough, (SELECT @row :=0) r 
) aux ON aux.num <= room.max_people 
LEFT JOIN [...] 
+0

嗨鍾波,這工作完美,似乎是我的情況最好的辦法。我非常感謝你的幫助,我會在我成功將其實際應用到我的實際代碼後標記爲已接受。謝謝 !!! – code90 2012-02-19 19:39:32

+0

輔助數字表在許多情況下都很有用。 – 2012-02-19 21:24:11

+0

經過幾個小時的努力沒有任何成功,必須看到整個表的工作方式,它的目的是一個很大的救濟:))再次感謝.. – code90 2012-02-19 23:23:05

1

你應該創建一個表,你有nr_of_people從1到max_people每個房間,和ROOM_ID。然後你可以做一個OUTER JOIN,按照你的要求獲取信息。

您也可以將其創建爲一個臨時表建設有你在你的代碼所需要的數據的查詢。

mysql> CREATE TEMPORARY TABLE nr (nr_of_people int, room_id int); 
Query OK, 0 rows affected (0.00 sec) 

mysql> INSERT INTO nr VALUES (1, 1), (2, 1), (1, 2), (2, 2), 
(3, 2), (1, 3), (2, 3), (3, 3), (4, 3); 
Query OK, 9 rows affected (0.00 sec) 
Records: 9 Duplicates: 0 Warnings: 0 

mysql> SELECT price.price, room.room_no, nr.nr_of_people 
FROM price 
RIGHT OUTER JOIN nr ON price.room_id = nr.room_id AND price.nr_of_people = nr.nr_of_people 
INNER JOIN room ON nr.room_id = room.room_id; 
+-------+---------+--------------+ 
| price | room_no | nr_of_people | 
+-------+---------+--------------+ 
| 80 |  101 |   1 | 
| 75 |  101 |   2 | 
| NULL |  102 |   1 | 
| 90 |  102 |   2 | 
| NULL |  102 |   3 | 
| NULL |  103 |   1 | 
| NULL |  103 |   2 | 
| 120 |  103 |   3 | 
| NULL |  103 |   4 | 
+-------+---------+--------------+ 
9 rows in set (0.00 sec) 
+0

嗨,abresas,非常感謝您的時間和幫助。這完美地工作,但它需要我輸入每個房間的max_number數字,這實際上是正確的,但Jong Bor的解決方案更適合,因爲它只需要在表格中使用未分類的順序編號。謝謝,無論如何.. – code90 2012-02-19 19:36:45