我正在针对四个表设置 mysql 查询,我希望左侧的结果不影响内部连接的查询。我做错了什么?原谅我的天真
这里的问题是,当我删除查询中的两个左连接时,我得到了预期的八个结果,但在查询中使用左连接时,即使产品表中有更多产品,我也只得到一个结果。
$this->getAllRecords("SELECT t.content_type_name as type,
p.title,p.start_date, p.end_date, p.last_enroll_date,
p.seat, p.cost, p.description, COUNT(r.stars) as review_count,
AVG(r.stars) as stars, i.image, p.location
FROM content_type t
INNER JOIN product p ON t.content_type_id=c.content_type_id
LEFT JOIN product_review r ON p.product_id=r.product_id
LEFT JOIN image i ON p.uid=i.reference_page_or_product
AND p.active=1
ORDER BY RAND()
LIMIT 8"))
无论是否有评论和图片,我都想要所有产品
最佳答案
您正在使用没有分组依据的聚合函数,这可能会产生不可预知的结果(可能您正在使用 5.7 之前的 mysql 数据库版本)
聚合结果可能与空值相关,这也可以减少/省略结果
您应该使用 group by 作为聚合函数并使用子查询来获取相关的有效结果..并使用子查询来进行左连接
SELECT t.content_type_name as type
, p.title,p.start_date
, p.end_date
, p.last_enroll_date
, p.seat
, p.cost
, p.description
, p.location
, i.image
, t.review_count
, t.stars
FROM content_type t
INNER JOIN product p ON t.content_type_id=c.content_type_id
AND p.active=1
LEFT JOIN (
SELECT r.product_id
, COUNT(r.stars) as review_count
, AVG(r.stars) as stars
FROM product_review r
GROUP BY r.product_id
) t ON ON p.product_id=t.product_id
LEFT JOIN image i ON p.uid=i.reference_page_or_product
ORDER BY RAND()
LIMIT 8
为了更好地查看 p.active=1 应该分配给产品的 on 子句
关于php - 有没有办法用子句 "inner join,"连接两个表,然后是多个 "left join"子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58769369/