1

我有一个category将类别编号与类别名称联系起来的表格。例如,1-水果、2-蔬菜、3-昆虫、4-城市等...

我有另一个表item,其中包含完全属于一个类别的项目。每个项目都有一个唯一的 ID、名称和类别。例如,314-南瓜-(类别)1

简而言之:

category
-------
c_id   (int)
c_name (varchar)

item
-------
i_id   (int)
i_name (varchar)
i_cat  (int)

问题是并非所有类别都有项目。我使用以下内容按类别订购商品:

$STH = $DBH->prepare("SELECT * FROM item ORDER BY i_cat");

这是内置在表格中的,在 cat(egory) 更改时提取标题。当然,没有项目的类别不会被选中。

我想要的是一个包含所有类别的表格(即使是那些没有实际项目的),并在每个类别下列出正确的项目。

我可以设计一些繁琐的方法来做我想做的事,但必须有一个巧妙的解决方案。如何在一次调用中加入两个表中的数据,以便每个类别和每个项目都存在?我认为它涉及使用inner join,但我看不出如何有效地做到这一点。

谢谢。

4

2 回答 2

2

尝试以下查询,它将从表中获取所有类别以及从category表中获取相应项目item

SELECT * 
FROM category c
LEFT JOIN item i
ON c.c_id = i.i_cat
ORDER BY i_cat
于 2012-04-09T05:41:07.867 回答
2

实际上,这不是inner join您要找的东西。Aninner join将获取所有匹配的值并删除不匹配的值。Aleft join将从左侧表格中获取值,并尝试将它们与右侧表格中的值连接起来。如果左表中的一行在右表中没有匹配项,则这些值将填充为NULL.

试试这个查询:

select * from category
left join item on c_id = i_id
order by i_cat
于 2012-04-09T05:44:18.163 回答