2010-05-19 2 views
2

Я не уверен, что лучший способ сформулировать этот вопрос так не терпится.Mysql: Закажите результаты по количеству совпадающих строк во второй таблице

Таблица А имеет следующие столбцы:

  • идентификатор
  • имя
  • Описание

Таблица B имеет следующие столбцы:

  • идентификатор
  • a_id (внешний ключ к таблице А)
  • ip_address
  • Дата

В основном Таблица B содержит строку каждый раз, когда пользователь просматривает строку из таблицы А.

Мой вопрос заключается в том, как сделать сортировать результаты Таблица А, исходя из количества совпадающих строк в таблице B.

т.е.

SELECT * 
    FROM TableA 
ORDER BY (SELECT COUNT(*) 
      FROM TableB 
      where TableB.a_id = TableA.id) 

Спасибо!

+0

В чем проблема с запросом, который у вас уже есть? –

+1

Ничего себе. Я написал этот запрос как псевдокод, фактически не задумываясь, чтобы проверить его. Никогда не думал, что это действительно сработает, но я просто проверил его, и это работает как шарм! – KyleT

ответ

3
SELECT a.* 
     , b.cnt 
     FROM TableA a 
    LEFT OUTER JOIN (SELECT a_id 
         , COUNT(*) cnt 
         FROM TableB b 
        GROUP BY a_id) b 
    ON a.id = b.a_id 
    ORDER BY b.cnt 
+1

Примечание: Это исключает строки из результата, если у них нет строк в TableB. –

+1

@Mark Byers - Исправлено. – dcp

+0

Спасибо за все ответы всем. Спасибо dcp, это сработало как шарм! – KyleT

0

Что-то вроде этого может сделать трюк.

select a.id, a.name, a.description, count(b.id) as count 
    from TableA as a 
    inner join TableB as b on a.id = b.a_id 
    group by a.id, a.name, a.description order by count 
+1

Примечание: Это исключает строки из результата, если у них нет строк в TableB. –

0

Ваш запрос уже делает то, что вы хотите. Вы можете добавить DESC, если вы хотите, чтобы строки с наибольшим числом строк первым:

SELECT * FROM TableA 
ORDER BY (SELECT COUNT(*) FROM TableB where TableB.a_id = TableA.id) DESC 
0
SELECT a.id, a.name, a.description, count(b.id) FROM TableA a 
    JOIN TableB b on b.a_id = a.id 
GROUP BY a.id, a.name, a.description ORDER BY COUNT(b.id); 

Вы можете добавить DESC ордера, может быть, это то, что вам нужно:

SELECT a.id, a.name, a.description, count(b.id) FROM TableA a 
    JOIN TableB b on b.a_id = a.id 
GROUP BY a.id, a.name, a.description ORDER BY COUNT(b.id) DESC; 
Смежные вопросы