SQL使用JOIN选择全部

时间:2014-02-09 19:07:52

标签: php sql

我正在使用此查询来整理两组结果,但我现在需要使用JOIN而不是UNION从另一个表中获取数据的第二部分。

但是我需要相当多的字段,并且在使用JOIN时似乎找不到使用SELECT *的方法。

mysql_query("SELECT * FROM table.products WHERE category='$cat'  GROUP BY product_id ORDER BY id UNION ALL SELECT * FROM table.products WHERE  type='red' GROUP BY product_id ");

表 - 产品

product_id | title    | category | id
0            one         home      10
1            two         home      11
1            two - a     home      12
2            three       work      13

表 - product_details

product_id | type | size |
0            blue   S
1            blue   M
1            red    L

最终,我需要在第一个表中列出给定类别的所有产品,例如home, 因为单个产品ID有时会有两个或更多条目,我只需要为每个产品ID值选择一行。我还需要加入第二个表格以便我可以获得尺寸信息,但是我必须能够通过选择类型为红色来获取尺寸信息。

因此,对于这个例子,我会得到一个如下列表:

 product_id  | title    | category | type | size
 0             one        home       blue    S
 1             two        home       red     L

这不包括product_id 2,因为它不在home类别中,因为GROUP BY和ORDER BY而选择了product_id等于1的第一个条目,并且product_id 1的大小信息是L,因为它是红色而不是蓝色

2 个答案:

答案 0 :(得分:0)

您的查询可以简化如下,因为您使用的是同一个表table.products。不确定为什么需要UNION他们。

SELECT * FROM table.products 
WHERE category='$cat' 
and type='red'
GROUP BY product_id  

修改

使用您编辑的帖子,查询应该如下所示

select p.product_id,p.title,p.category,q.type,q.size
from products p join product_details q
on p.product_id = q.product_id
where p.category =  'home'
and q.type = 'red'

答案 1 :(得分:0)

假设您使用的是MySQL,则需要使用聚合或积极过滤进行连接。以下是使用joinaggregation的示例:

select p.product_id, p.title, p.category,
       substring_index(group_concat(pd.type order by pd.type = 'red' desc, pd.type), ',', 1) as type,
       substring_index(group_concat(pd.size order by pd.type = 'red' desc, pd.type), ',', 1) as size
from products p join
     product_details pd
     on p.product_id = qpd.product_id
where p.category =  'home'
group by p.product_id;

表达式substring_index(group_concat(. . .))正在选择一个type(和一个size),并优先考虑red类型。