#select #count #sql-order-by
#выберите #количество #sql-упорядочение по
Вопрос:
Хорошо, итак, у меня есть запрос, который я пытаюсь создать.. У меня есть 2 таблицы, в таблице 1 содержится множество обычных записей, как обычно, с уникальным идентификатором (автоматическое увеличение), а в таблице 2 есть записи, которые включают некоторые из этих идентификаторов из таблицы1. Я пытаюсь упорядочить по самым высоким записям с тем же идентификатором в table1.. Вот что у меня получилось:
SELECT * FROM table1
WHERE table1.status = 1
AND (SELECT COUNT(*) FROM table2 WHERE table2.tbl1_id = table1.id)
ORDER BY table1.id DESC
Спасибо 🙂
Ответ №1:
SELECT table1.id
FROM table1
LEFT JOIN table2 ON table2.tbl1_id = table1.id
WHERE table1.status = 1
GROUP BY table1.id
ORDER BY COUNT(table2.tbl1_id) DESC
Комментарии:
1. Должно получиться… Вы изменили это? (т. Е. добавили дополнительные столбцы) Если вы добавляете столбцы в
SELECT
, вам нужно добавить их вGROUP BY
или использовать подход, приведенный в ответе Cybernate.2. в обеих таблицах тысячи записей, лол, и я пробовал как вашу, так и Cybermates, она не возвращает правильные записи..
3. Возможно, тогда вы недостаточно четко объяснили свои требования. Запросы как в моих, так и в ответах Cybernate получат подсчет количества совпадающих записей в
table2
для каждогоtable1.id
( включая те, где количество равно нулю ) и упорядочат по этомуcount
. разве это не то, что вы имели в виду? Если бы вы хотели исключить единицы с нулевым количеством, вы бы использовалиINNER JOIN
4. ОК, понял 🙂 твое сработало 🙂 Спасибо и Мартину, и Cybermate!
Ответ №2:
Попробуйте это:
SELECT a.*, b.cnt
FROM table1 a LEFT JOIN
(
SELECT tbl1_id, COUNT(*) cnt
FROM table2
GROUP BY tbl1_id
) b
ON a.id = b.tbl1_id
WHERE table1.status = 1
ORDER BY cnt DESC
Комментарии:
1. Если в table2 нет соответствующих записей для идентификатора, вы все еще хотите показать запись из table1 в своем результате, и если да, то должны ли они отображаться со счетом 0?