MYSQL - 连接查询有点麻烦/困惑

标签 mysql join

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

  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

并且从 select 子句中取出 sale

所发生的情况是,产品表中描述包含“CLOVER”的所有产品均被退回。

添加已删除的查询部分后,仅返回正在促销的商品(在促销表中具有匹配的 ID)。 products 表中任何包含“CLOVER”且不“促销”的其他产品都将被排除。

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

据我了解,这本质上与从 product_depts 表调用 deptId 是一样的,效果非常好。所以这让我很困惑。

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

谢谢!

最佳答案

内部联接基本上是说“检索两个表中都有匹配记录的所有记录”。

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

听起来您想要获取所有产品,无论它们是否有促销,但如果它们确实有促销,也请检索促销信息。

那就这样

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。

关于MYSQL - 连接查询有点麻烦/困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8041039/

相关文章:

mysql bool 连接

php - MySQL:如何使用 1 个 WHERE IN CLAUSE 从 2 个不同的表中获取结果

mysql - 防止 Sequelize 插入时间戳

MySQL - JOIN 2个表有2个共同的ID

mysql - JOIN 两个 sql SELECT 语句,其中一个有单条记录,另一个有多条记录

mysql - SQL 从多个表中选择 sql-ex 6

mysql - MySQL有必要加DEFAULT NULL吗?

mysql - 需要数据库两个月前每小时的数据

mysql - 非常慢的 MySQL 代码(内联和 JOINS)

MySQL Join 不返回与新数据库实例中的两个表匹配的数据