Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
SUM(IF(f1 = 2, f2, 0)) индексы использовать если и будет, то гораздо менее оптимально, т.к. IF — это функция, и в неё нужно будет подать каждое существующее значение f1. В то же время, SELECT SUM(f2) WHERE f1 = 2 прекрасно использует индекс по условию, а потом уже просуммирует отфильтрованные данные.Поиск данных за последнюю дату
…
SELECT p.uid, p.amount FROM payments p JOIN (SELECT uid, MAX(pay_date) AS max_dt FROM payments GROUP BY uid) sel ON p.uid = sel.uid AND p.pay_date = sel.max_dt;
SELECT uid, MAX(pay_date) FROM payments GROUP BY uid;
Вы это серьезно?
Он ошибся со структурой таблицы, и я ему это сразу пояснил. Не верите? возьмите и проверьте. Всё увидите своими глазами.
SELECT uid, amount
FROM payments
WHERE (id,uid) IN (SELECT MAX(id), uid
FROM payments p
GROUP BY uid, pay_date
HAVING pay_date = (SELECT max(pay_date) FROM payments WHERE uid=p.uid)
);
Ага, вот только бОльший id не означает, что платёж был проведён позже.
pay_date вместо idТогда опять дубликаты появятся ;-)
SELECT
p.uid,
p.amount
FROM
payments p
WHERE
p.id = (
SELECT p2.id
FROM payments p2
WHERE p.uid = p2.uid
ORDER BY p2.pay_date DESC, p2.id DESC
LIMIT 1
)
SELECT p.uid, p.amount
FROM payments p
JOIN
(SELECT uid, MAX(pay_date*1000000 + id) AS max_dt
FROM payments
GROUP BY uid) sel ON p.uid = sel.uid
AND (p.pay_date*1000000 + p.id) = sel.max_dt;SELECT t1.id, t2.id
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id_t1
GROUP BY t1.id;GROUP BY 1GROUP BY или ORDER BY обозначают номер колонки. Это плохая практика для рабочего кода. Но очень удобно, когда вам надо просто извлечь информацию из таблицы (особенно если вы пишете запрос руками).SELECT *
FROM address
WHERE num + 0 = 1;
SELECT t1.id, t2.id
FROM table1 t1
JOIN table2 t2 ON t1.id = t2.id_t1
GROUP BY 1;
ALTER IGNORE TABLE table1 ADD UNIQUE..., но в продолжении описаны методы, которые реально ломают использование индексов — огорчили.SELECT ua.uid, ua.amount
FROM (
SELECT p.uid, p.amount
FROM payments p
ORDER BY pay_date DESC
) ua
GROUP BY ua.uid
Нужно написать запрос, который бы вывел для каждого юзера дату и сумму последнего платежа.
UPD. Считаем, что юзер не может провести больше одного платежа за секунду. (Без этого условия постановка задачи некорректна). Тип pay_date изменен с DATE на DATETIME.
SELECT SELECT p.uid, p.amount
FROM payments p
GROUP BY p.uid
ORDER BY p.pay_date DESCSELECT * FROM (SELECT p.uid, p.amount FROM payments p ORDER BY p.pay_date DESC) t GROUP BY t.uid
Несколько интересных приемов и особенностей работы с MySQL