MYSQL - 加入查询有点麻烦/困惑

时间:2011-11-07 18:44:25

标签: mysql join

我正在尝试将一个mysql查询放在一起,将3个表链接在一起。实质上,表格如下:

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

    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子句中取出,

    会发生什么,是产品表中包含“CLOVER”描述的所有产品都会被退回。

    通过添加已删除的查询部分,仅返回促销中的项目(在促销表中具有匹配的ID)。在products表中包含“CLOVER”的任何其他产品,如果没有“促销”,则会被排除在外。

    由于我对mysql的知识非常有限,我想也许有人对此事有很多知识要分享...想提供一些意见。

    正如我所理解的那样,这与从deptId表中调用product_depts基本相同,完全正常。所以这让我很困惑。

    我做错了只显示“促销时”的商品而忽略了其他结果?

    谢谢!

1 个答案:

答案 0 :(得分:2)

INNER联接基本上说“检索BOTH表中匹配记录的所有记录”。

如果我正确地阅读你的问题,听起来你想要的是LEFT或RIGHT联接,这意味着“检索一个表中的所有记录,以及(如果有的话)来自另一个表的匹配记录。

听起来您想要获得所有产品,无论他们是否有促销活动,但如果他们确实有促销活动,也可以检索促销信息。

那就是

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

所以...所有产品必须有一个部门,所以对于查询的特定部分进行内部联接。促销中的左连接使'products'表成为LEFT表,因此获取该表中的所有记录。促销表成为RIGHT表,如果促销表中有匹配的记录,则仅提供查询结果的数据。

所以...鉴于2件产品,其中1件正在销售中,你会得到

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

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