php - 有没有办法用子句 "inner join,"连接两个表,然后是多个 "left join"子句

标签 php mysql

我正在针对四个表设置 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/

相关文章:

php - Yii2 依赖注入(inject)示例

mysqld : dial tcp 127. 0.0.1:3306: 连接:连接被拒绝

mysql - django查询返回主键相关列值

php - MySQL 查看引用表?

php - Sql 查询返回对象

php - 在同一页面中组合特定页面样式和全局样式时的性能

php - 在事件监听器中调用 Controller /操作

mysql - 在mysql中以15分钟为间隔获取结果

php - 付款失败的 Stripe 结帐事件

php - 使用 Laravel 上传和显示保存在 PostgreSQL 中的 PDF 文件