如何使用 JOIN 语句进行 ORDER BY DESC?

How to ORDER BY DESC with JOIN statement?

我有这样的查询:

SELECT
        result.ip,
        ips.ipStatus,
        result.quantity,
        result.clickDates,
    FROM
        ips
    INNER JOIN
        (
            SELECT
                visits.ip,
                count(visits.ip) AS quantity,
                GROUP_CONCAT(clicks.clickDate) AS clickDates,
            FROM
                visits
            INNER JOIN
                clicks 
                    ON visits.id = clicks.id 
            WHERE
                clicks.clickDate BETWEEN 1 AND 10 
            GROUP BY
                visits.ip 
            ORDER BY
                null
        ) AS result 
            ON ips.ip = result.ip LIMIT 6, 2

它产生这样的结果table:

   ip    |    status    |    quantity    |       date 

1.1.1.1        ok               3            555, 557, 558
2.2.2.2        ok               1            657

我的日期存储在 .ms (BIGINT) 中。我的目标是 ORDER BY 约会 DESC。我想最新的 ips 将在顶部。所以我试图在 ORDER BY clicks.clickDate DESC 上更改 ORDER BY。但它给了我一个错误:

Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column

所以我有两个问题:

如果我在 clicks.clickDate 列上使用 GROUP_CONCAT,是否可以 ORDER BY? 也许有一种方法可以只显示 clicks.clickDate 上 GROUP_CONCAT 之后的最后一个值?

您可以尝试在GROUP_CONCAT中添加order by并添加一列MAX(clicks.clickDate)以获得组中的最大值clickDate,对于主查询order by.

SELECT
    result.ip,
    ips.ipStatus,
    result.quantity,
    result.clickDates,
FROM
    ips
INNER JOIN
    (
        SELECT
            visits.ip,
            count(visits.ip) AS quantity,
            GROUP_CONCAT(clicks.clickDate ORDER BY clicks.clickDate desc) AS clickDates,
            MAX(clicks.clickDate) maxDt
        FROM
            visits
        INNER JOIN
            clicks 
                ON visits.id = clicks.id 
        WHERE
            clicks.clickDate BETWEEN 1 AND 10 
        GROUP BY
            visits.ip 
    ) AS result 
        ON ips.ip = result.ip 
ORDER BY maxDt DESC
LIMIT 6, 2

尝试按每条记录中的最大 点击日期排序。请注意,我们需要将文本日期数值强制转换为实际整数,这样排序才能正常进行。

SELECT
    r.ip,
    i.ipStatus,
    r.quantity,
    r.clickDates,
FROM ips i
INNER JOIN
(
    SELECT
        visits.ip,
        count(visits.ip) AS quantity,
        GROUP_CONCAT(clicks.clickDate ORDER BY clicks.clickDate desc) AS clickDates,
        MAX(CAST clicks.clickDate AS UNSIGNED) maxDt
    FROM
        visits
    INNER JOIN
        clicks 
            ON visits.id = clicks.id 
    WHERE
        clicks.clickDate BETWEEN 1 AND 10 
    GROUP BY
        visits.ip 
) r
    ON i.ip = r.ip 
ORDER BY maxDt DESC
LIMIT 6, 2;