我正在尝试将一个mysql查询放在一起,将3个表链接在一起。实质上,表格如下:
这是查询:
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
基本相同,完全正常。所以这让我很困惑。
我做错了只显示“促销时”的商品而忽略了其他结果?
谢谢!
答案 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。