2011-10-16 162 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