mysql - sql查询将两个查询合并为一个空行

标签 mysql sql

这是我的sql表结构:

表 1:详细信息

    |--id--|--id_user--|--price--|
    |  1   |    1      |   10    |
    |  2   |    2      |   15    |
    |  3   |    1      |   25    |
    |  4   |    3      |   30    |
    |  5   |    3      |   7     |
    ------------------------------

表2:用户

    |--id--|--id_country--|
    |  1   |       1      |
    |  2   |       2      |
    |  3   |       0      |
    -----------------------

表 3:国家

    |--id--|--country--|
    |  1   |  France   |
    |  2   |  Italy    |
    --------------------

我需要的是按国家/地区获取价格总和:

SELECT c.country, SUM(d.price) AS price
    FROM details d
        INNER JOIN users u ON u.id = d.id_user
        INNER JOIN country c ON  c.id = u.id_country
    GROUP BY c.country
    ORDER BY c.country

我明白了:

|--country--|--price--|
|  France   |   35    |
|  Italy    |   15    |
-----------------------

但我需要得到这个:

|--country--|--price--|
|  France   |   35    |
|  Italy    |   15    |
| Undefined |   37    |
-----------------------

如果 id_country=0,则 undefined 会出现。 (我无法将 id=0 或 id=undefined 添加到国家/地区表,它会搞乱其他内容)。现在我通过两个单独的查询来实现这一点,第二个是:

SELECT SUM(d.price) as price
    FROM details d 
        INNER JOIN users u ON u.id = d.id_user AND u.id_country=0
    GROUP BY u.id_country

我在想是否...是否可以在一个查询中执行此操作?

最佳答案

在这种情况下你需要使用左连接:

SELECT c.country, SUM(d.price) AS price
    FROM details d
        LEFT JOIN users u ON u.id = d.id_user
        LEFT JOIN country c ON  c.id = u.id_country
    GROUP BY c.country
    ORDER BY c.country

如果您使用 INNER JOIN,您将只会得到同时存在于两个表中的结果。

将 NULL 替换为 Undefined 使用:

SELECT IFNULL(c.country,'Undefined') AS Country, SUM(d.price) AS price
    FROM details d
        LEFT JOIN users u ON u.id = d.id_user
        LEFT JOIN country c ON  c.id = u.id_country
    GROUP BY c.country
    ORDER BY c.country

一种将 Undefined 排序到最后的方法是添加一个 Sortfield

SELECT A.Country,A.Price FROM (
    SELECT IFNULL(c.country,'Undefined') AS Country, SUM(d.price) AS price, IFNULL(c.Country,'ZZZZZZZZ') AS Sort
        FROM details d
            LEFT JOIN users u ON u.id = d.id_user
            LEFT JOIN country c ON  c.id = u.id_country
        GROUP BY c.country
) A
ORDER BY A.Sort

编辑:评论中建议的 ORDER BY

SELECT IFNULL(c.country,'Undefined') AS Country, SUM(d.price) AS price
    FROM details d
        LEFT JOIN users u ON u.id = d.id_user
        LEFT JOIN country c ON  c.id = u.id_country
    GROUP BY c.country
    ORDER BY c.country IS NULL, c.country

关于mysql - sql查询将两个查询合并为一个空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39890065/

相关文章:

mysql - SQL - where 子句中的情况

sql - 如果其他列具有相同的值,如何连接列的值

php - 搜索拥有超过300万条记录的mysql数据库

php - 如何从mysql表中获取我的本地时间

sql - MongoDB 相当于 SQL "OR"

sql - 如何使用 nextval() 在字符串中插入包含其自己 ID 的行

mysql - iBatis selectKey 和事务

MYSQL 按兼容性分组产品

mysql - 如何为每篇文章选择作者姓名?

mysql - 如何使用MYSQL插入命令将图像添加到phpmyadmin的表中?