2011-12-18 57 views
6

我对我的产品来检查我卖(主要是游戏机和游戏)MySQL错误在我的查询

我希望看到哪些产品有哪些类别,这是我的查询:

select * From products left join products_categories on (product_id=id) ; 
+------+------+------------+-------------+---------- 
| id | name | product_id | category_id | and more 
+------+------+------------+-------------+---------- 
| 4 | Xbox |   4 |   2 | 
| 5 | PS3 |   5 |   2 | 
| 7 | BAD |  NULL |  NULL | 
etc... 
+------+------+------------+-------------+--------- 

这里我有一个产品(#7 - 坏),我不想看到,因为我删除类别,

我不想看到产品没有类别?

+0

你只是想看看'products'那些在'products_categories'匹配的条目?在这种情况下,你需要一个'INNER JOIN'而不是'LEFT JOIN'。 – grossvogel 2011-12-18 17:57:56

回答

8

左JOIN命令用于结合空匹配的行被存储在相关表 为了加入这些表中,连接表 要求从左侧 表的公共字段(通常称为外键) 。这种连接类型需要关键字ON或USING。

实施例:

SELECT * 
From products 
LEFT JOIN products_categories ON (product_id=id) 
WHERE product_id IS NOT NULL; 

或者可以使用的INNER JOIN:

加入或INNER JOIN命令用于结合非空匹配 行被存储在相关表为了连接这些表, 连接表需要左表中的公用字段(通常称为外键) 。这种连接类型需要关键字ON或USING。

例子:现在

SELECT * From products INNER JOIN products_categories ON (product_id=id); 

,我会建议增加一个标志无效或有效的产品,这样你就不需要删除类别产品,如果它是无效的。这样,如果你想重新激活它,只需将标志返回到1或你使用的任何标志。

例子:

SELECT * 
FROM products 
INNER JOIN products_categories ON (product_id=id) 
WHERE products.is_active = 1; 
+0

感谢您的提示 – fred 2011-12-18 18:05:21

+0

欢迎您 – 2011-12-18 18:05:56

+0

顺便说一句,围绕ON子句的括号是多余的。 – 2011-12-18 18:13:09