2011-11-07 60 views
0

我想放在一起一个MySQL查询,即链接3个表一起。本质上,表格如下:MYSQL - 一点点的麻烦/混淆加入查询

  1. 产品 - 包含产品信息和基本价格。
  2. product_depts - 将产品链接到不同部门的链接表。
  3. 促销 - 另一个链接表,根据产品ID链接促销期和价格。

这是查询:

SELECT p.id, `desc` , price1, price2, cost1, taxable, quantity, deptId, sale 
FROM products p 
INNER JOIN product_depts ON p.id = prodId 
INNER JOIN promotions s ON p.id = s.id 
WHERE MATCH (
`desc` 
) 
AGAINST (
'CLOVER' 
IN BOOLEAN 
MODE 
) 
ORDER BY `desc` 
LIMIT 0 , 30 

如果下面的行被删除:

INNER JOIN promotions s ON p.id = s.id 

而且sale取出SELECT子句,

会发生什么事,是ALL返回产品表中包含“CLOVER”描述的产品。

随着添加删除的查询部分,仅返回促销中的项目(在促销表中具有匹配的id)。此外,products表中包含“CLOVER”的附加产品不属于“促销活动”。

由于我对mysql的知识非常有限,我以为也许有人在这个问题上有大量的知识分享......想提供一些有关这方面的意见。

据我所知,这将基本上是从product_depts表中调用deptId完全相同的东西。所以这让我感到困惑。

我在做什么错,只显示“促销”的项目并显示额外的结果?

谢谢!

+2

改为使用'LEFT JOIN'。 – diEcho

回答

2

INNER加入基本上说“检索所有记录在两个表中都有匹配的记录”。

如果我正确地阅读你的问题,这听起来像你想要的是一个左或右连接,这意味着“从一个表中检索所有记录,并且(如果有的话)匹配另一个表中的记录。

听起来像是你想获得的所有产品,无论他们有一个促销或没有,但如果他们有一个促销活动,获取促销信息也是如此。

这会是

SELECT ... 
FROM products 
INNER JOIN product_depts ON ... 
LEFT JOIN promotions ON ... 

所以...所有的产品都必须有一个部门,所以做一个客栈呃加入查询的特定部分。促销中的左连接使“产品”表成为左表,因此该表中的所有记录都被提取。如果促销表中存在匹配记录,则促销表将成为RIGHT表,并且仅为查询结果提供数据。

所以...给出2个产品,其中1个正在销售,你会得到

product #1 department #1 promoinfo #1 
    product #2 department #2 NULL 

结果。由于#2产品没有匹配的促销信息,因此促销数据会得到NULL。

+0

确切点,并解决问题!你总是用我的问题制作百果馅,谢谢! –

+0

如果我可以给你两次投票我会,这是一个非常有用的帖子,再次感谢! –