MySql 查询连接 3 个空行的表

标签 mysql sql

我想按用户 ID 列出数据库中的每个产品以及访问者跟踪和销售信息。

这是我目前得到的:
http://www.sqlfiddle.com/#!2/ec506/19

SELECT products.product_name,
       tracking.unique_hits,
       tracking.total_hits,
       COUNT(sales.product_id) as total_sales,
       SUM(sales.amount) as total_revenue
FROM products
INNER JOIN tracking ON products.id = tracking.product_id
INNER JOIN sales ON products.id = sales.product_id
WHERE products.vendor_id = 0;

它输出这个:

|   PRODUCT_NAME | UNIQUE_HITS | TOTAL_HITS | TOTAL_SALES | TOTAL_REVENUE |
|----------------|-------------|------------|-------------|---------------|
| test product 1 |          42 |         52 |           3 |            30 |

但我希望它也输出没有销售的产品,所以它应该输出这样的东西:

|   PRODUCT_NAME | UNIQUE_HITS | TOTAL_HITS | TOTAL_SALES | TOTAL_REVENUE |
|----------------|-------------|------------|-------------|---------------|
| test product 1 |          42 |         52 |           3 |            30 |
| test product 2 |          10 |         13 |           0 |             0 |

或者

|   PRODUCT_NAME | UNIQUE_HITS | TOTAL_HITS | TOTAL_SALES | TOTAL_REVENUE |
|----------------|-------------|------------|-------------|---------------|
| test product 1 |          42 |         52 |           3 |            30 |
| test product 2 |           0 |          0 |           0 |             0 |

如果表中甚至没有访问者跟踪数据。

我不知道该怎么做。需要一些帮助! :)

最佳答案

只需切换到左外连接:

SELECT products.product_name,
       tracking.unique_hits,
       tracking.total_hits,
       COUNT(sales.product_id) as total_sales,
       coalesce(SUM(sales.amount), 0) as total_revenue
FROM products
LEFT OUTER JOIN tracking ON products.id = tracking.product_id
LEFT OUTER JOIN sales ON products.id = sales.product_id
WHERE products.vendor_id = 0
GROUP BY products.product_name, tracking.unique_hits, tracking.total_hits;

编辑:

感谢 M Khalid 提供的group by。我会用表别名编写此查询以使其更易于阅读:

SELECT p.product_name, t.unique_hits, t.total_hits,
       COUNT(s.product_id) as total_sales,
       coalesce(SUM(s.amount), 0) as total_revenue
FROM products p LEFT OUTER JOIN
     tracking t
     ON p.id = t.product_id LEFT OUTER JOIN
     sales s
     ON p.id = s.product_id
WHERE p.vendor_id = 0
GROUP BY p.product_name, t.unique_hits, t.total_hits;

关于MySql 查询连接 3 个空行的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23278580/

相关文章:

python - 我可以在 SQLAlchemy ORM 中使用动态关系(或 VIEWS)吗?

sql - 大表左连接更高效

sql - 使用一列的值作为另一列(SQL Server)?

php - 如果 PDO 事务失败,如何重定向到一个页面?

mysql - 如果存在多个唯一索引(MySQL),则插入表或更新

mysql - 我无法执行我的存储过程,我的查询一直在运行

mysql - 外键列可以选择包含 NULL 或 ID。有更好的设计吗?

sql - 使用SQL查找不匹配的记录

php - 从sql中获取实际的年月数据

php - 在 symfony3 中使用 postgres 数据库