即使不是一个表中的所有行在另一个表中都有核心响应者,如何从 MySQL 中的两个表中进行选择?
Posted
技术标签:
【中文标题】即使不是一个表中的所有行在另一个表中都有核心响应者,如何从 MySQL 中的两个表中进行选择?【英文标题】:How to select from two tables in MySQL even if not all rows in one table have corespondents in the other? 【发布时间】:2010-10-19 14:34:20 【问题描述】:我有两张网店的桌子:
一个用于类别:id、title 一个用于产品:id、ownerid、title、price(ownerid 是父类别的 id)我想选择所有类别并选择每个类别的最低和最高价格,因此查询如下:
SELECT
sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
FROM
categories AS sc, products AS s
WHERE s.ownerid=sc.id
GROUP BY sc.id
它的工作原理与预期的差不多,唯一的例外是如果一个类别中没有任何产品,那么它就不会被选中。虽然这似乎合乎逻辑,因为我要求“s.ownerid=sc.id”,但我不知道足够的 SQL 以使其按预期工作。我需要所有类别,对于没有产品的类别,minp 和 maxp 应该为 0。
有什么建议吗?谢谢。
【问题讨论】:
你应该看看这个phpweby.com/tutorials/mysql/32 基本上你需要创建一个左连接或右连接。 【参考方案1】:为此,您需要一个外部联接。顺便说一句,使用隐式连接编写查询的方式已经过时,不再推荐。建议使用 JOIN 关键字。这也使得将内部联接更改为外部联接变得更加容易。
FROM categories AS sc
LEFT JOIN products AS s
ON s.ownerid=sc.id
要返回 0 而不是 NULL,请使用 IFNULL(..., 0)
。整个查询变为:
SELECT
sc.*,
IFNULL(MIN(s.price), 0) AS minp,
IFNULL(MAX(s.price), 0) AS maxp
FROM categories AS sc
LEFT JOIN products AS s
ON s.ownerid = sc.id
GROUP BY sc.id
您可能还想考虑对于没有产品的类别返回默认 NULL 而不是 0 是否更好。
【讨论】:
【参考方案2】:LEFT JOIN
(W3Schools) 怎么样?
SELECT
sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
FROM
categories AS sc
LEFT JOIN products AS s
ON s.ownerid=sc.id
GROUP BY sc.id
【讨论】:
【参考方案3】:你想进行左连接:
SELECT
sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
FROM
categories AS sc
LEFT JOIN products AS s on s.ownerid=sc.id
GROUP BY sc.id
使用左连接时,您会从左连接(此处为类别)左侧的表中获取数据,如果存在则从右侧获取。
【讨论】:
【参考方案4】:我认为你想要的是 LEFT JOIN, 例如:
SELECT
sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
FROM categories sc
LEFT JOIN products s ON s.ownerid = sc.id
GROUP BY sc.id
【讨论】:
【参考方案5】:尝试使用左连接:
SELECT sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
FROM categories AS sc
LEFT JOIN products AS s ON s.ownerid = sc.id
GROUP BY sc.id
但是,毫无疑问,使用笛卡尔积并不是最好的解决方案。大多数引擎应该能够“远离”优化它,但在大多数情况下,连接也更加直观——而且速度更快,这是有疑问的。
【讨论】:
以上是关于即使不是一个表中的所有行在另一个表中都有核心响应者,如何从 MySQL 中的两个表中进行选择?的主要内容,如果未能解决你的问题,请参考以下文章