2011-10-16 160 views
3
SELECT * FROM `restaurants` WHERE name LIKE '%string%' 

SELECT * FROM `restaurants` WHERE address LIKE '%string%' 

SELECT * FROM `menu_items` WHERE name LIKE '%string%' 

我有這些疑問。SQL:結合結果

此刻我分別顯示每個查詢結果。我想將它們全部結合起來。

而所有的結果應該有他們從哪裏來的別名。 示例顯示來自menu_items的項目/行時,您應該能夠在「類型」列中看到它是「項目」。

餐廳地址結果的'地址'和餐廳名稱結果的'名稱'。

in MySQL

我該怎麼做?

我最後的輸出應該是這樣的:你後的「s」

Spagetti - item 
Sonus Suni - restaurant 
Sunssisway 1232 - restaurant address 
Delicous Spaga - item 

搜索,所以我會需要創建自己的別名列..「項」 AS「類型」等。

+0

哪個otput格式,你想看看嗎? – sll

+0

看到我的小更新希望,這就是你的意思 – Karem

+0

看到我更新的答案,你會得到相同的只有一行每餐具/項目。我建議在這種情況下在應用程序中格式化最終輸出而不是DB(您可以使用PIVOT將列切換到行,但我認爲這不適用於此特定商業案例) – sll

回答

2

如果你想與表列不同的組合,你必須指定你想要的列。

SELECT 
    'Name' AS Type, 
    Id AS R_Id, 
    NULL AS I_Id, 
    Name, 
    Address, 
    NULL AS M_Id 
FROM Restaurants 
WHERE Name LIKE '%string%' 
UNION ALL 
SELECT 
    'Address' AS Type, 
    Id AS R_Id, 
    NULL AS I_Id, 
    Name, 
    Address, 
    NULL AS M_Id 
FROM Restaurants 
WHERE Address LIKE '%string%' 
UNION ALL 
SELECT 
    'Item' AS Type, 
    NULL AS R_Id, 
    Id AS I_Id, 
    Name, 
    NULL AS Address, 
    M_Id 
FROM Menu_Items 
WHERE Name LIKE '%string%' 
+0

+1爲提供餐廳名稱到地址的想法,以及提供找到的項目的ID(PK)。只有一個問題:什麼是「Menu_Items.M_Id」,它與「Menu_Items.Id」有什麼不同? (好吧,這實際上聽起來像是兩個問題。) –

+0

This Works! @Andiry m_id是菜單ID – Karem

1

如果所有三個表具有相同的列數,你可以使用UNION ALL

SELECT * FROM `restaurants` WHERE name LIKE '%string%' 
UNION ALL 
SELECT * FROM `restaurants` WHERE address LIKE '%string%' 
UNION ALL 
SELECT * FROM `menu_items` WHERE name LIKE '%string%' 

!!!重要:

第一個SELECT語句的列名稱將用作返回結果的 列名稱。在 列出的選定列中,每個SELECT語句的相應位置應該具有相同的 數據類型。 (例如,由第一 語句選擇的第一列應具有相同的類型由 中的其他語句中選擇的第一列。)

如果數據類型對應的選擇列不匹配,則 類型和UNION結果中列的長度考慮了由所有SELECT語句檢索的值 。

有關詳細信息與示例,請參閱官方MySQL Documentation on UNION statement

編輯:更新

如果menu_items表有FK上restaraunts表,你可以加入這兩個表,並選擇合併的輸出數據,例如:

SELECT r.*, mi.* 
FROM restaurants r 
INNER JOIN menu m ON m.R_ID = r.ID 
INNER JOIN menu_items mi ON m.ID = mi.M_ID 
WHERE r.name LIKE '%string%' 
    AND r.address LIKE '%string%' 
    AND mi.name LIKE '%string%' 
+0

它們沒有相同的列數 – Karem

+0

Doesm menu_items引用restaraunts表嗎?像RestarauntId? – sll

+0

不,它們具有對menuId的引用,然後引用該餐廳。 – Karem