Как заказать по DESC с оператором JOIN? - PullRequest
0 голосов
/ 05 ноября 2018

У меня такой запрос:

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

В результате получается таблица результатов:

   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 на ORDER BY clicks.clickDate DESC. Но это дает мне ошибку:

Выражение # 1 предложения ORDER BY отсутствует в предложении GROUP BY и содержит неагрегированный столбец

Итак, у меня есть два вопроса:

Возможно ли ORDER BY, если я использую GROUP_CONCAT в столбце clicks.clickDate? Может быть, есть способ показать только последнее значение после GROUP_CONCAT на clicks.clickDate?

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Попробуйте упорядочить по величайшей дате клика в каждой записи. Обратите внимание, что нам нужно привести числовое значение текстовой даты к фактическому целому числу, чтобы сортировка работала правильно.

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;
0 голосов
/ 05 ноября 2018

Вы можете попытаться добавить order by в GROUP_CONCAT и добавить один столбец 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
...