2012-02-14 152 views
1

的BY我有两个MySQL表如下:ORDER BY和GROUP MySQL查询

[product] table 
P_id | Name | Quantity 
1 | B | 10 
2 | C | 15 
3 | A | 8 

[attribute] table 
P_id | Name | Quantity 
1 | Black | 5 
1 | Red | 5 
2 | Blue | 6 
2 | Black | 9 

我如何写一个SQL查询,以便它可以显示从以上两个表的结果如下: 报告:

P_id | Name | Quantity 
3 | A  | 8 
1 | B  | 10 
1 | Black | 5 
1 | Red | 5 
2 | C  | 15 
2 | Black | 9 
2 | Blue | 6 

这些应该在[名称]列进行排序,但是这些应该在P_ID柱如上进行分组。通过对P_id进行“分组”,我的意思是“用相同的P_id保留所有记录”。是否有可能使用单个SQL查询来检索上述安排。

+1

为了澄清,通过“分组”你的意思是“保留所有记录具有相同'P_id'相邻”(而不是实际的'GROUP BY'条款),对不对? – Wiseguy 2012-02-14 15:28:05

+0

这两个表格之间的关系是什么?你想知道什么?我的猜测是product.P_id是由attribute.P_id引用的外键。是对的吗? – AlexS 2012-02-14 15:32:07

+1

据我了解,订单是按产品的产品名称和相关产品名称的属性。起初这个模型看起来很奇怪,但在一段时间后它有点意义。 – voidengine 2012-02-14 15:34:00

回答

3
SELECT P_id, Name, Quantity FROM (
    SELECT P_id, Name, Quantity, Name as parent, 1 as level 
    FROM product 
    UNION 
    SELECT a.P_id, a.Name, a.Quantity, p.Name as parent, 2 as level 
    FROM attribute a JOIN product p ON a.P_id = p.P_id 
) combined ORDER BY parent, level, Name 
+0

我相信你的回答可以解决我的问题,但它不会显示一个P_id的所有记录在一起。我想一起保留具有相同P_id的所有记录。 – Agilox 2012-02-14 15:45:31

+1

+1了解所需的顺序(当然,实际上完成它) – Wiseguy 2012-02-14 15:58:01

+1

固定和测试:1)你需要在MySQL中的子选择的别名。 2)需要按名称排序以使用相同的P_id排序属性。 现在它给出了所需的结果。 – voidengine 2012-02-15 14:43:21

0

它应该是联盟的运作,我相信是这样的:

select * from product union select * from attribute order Name; 

不知道为什么你写的,你需要'组由”因为你的输出不受任何列分组。

+1

我没有看到第一篇文章中的示例中的分组。 – koen 2012-02-14 15:23:56

0

你的意思是说你只需要两个表的联合? 你可以试试这个:

Select P_id, Name, Quantity 
From product 

Union 

Select P_id, Name, Quantity 
From attribute 

Order by 2 
+0

有没有组 – Taryn 2012-02-14 15:24:34

+0

wasimchy说他想分组,但没有必要的分组。 – koen 2012-02-14 15:25:32

+0

根据你的例子,没有必要的团体,只有一个工会。产品的数量已经在桌面上。 – Schiavini 2012-02-14 15:25:39

0
SELECT * FROM 
(
    SELECT P_id, Name , Quantity FROM product 
    UNION ALL 
    SELECT P_id, Name , Quantity FROM attribute 
) Order by Name 
+0

SELECT *和()将不是必需的 – Schiavini 2012-02-14 15:26:44

0

你将不得不使用分组我的朋友。然后你就可以在命令你们俩需要这样的列:

SELECT * FROM product UNION SELECT * FROM attribute ORDER BY Name, P_id; 
0

如果你希望他们通过的p_id,然后名称排序,这应该工作。

(SELECT P_id, Name, Quantity FROM product) 
UNION 
(SELECT P_id, Name, Quantity FROM attribute) 
ORDER BY P_id, Name;