2010-05-19 147 views
2

我不确定将这个问题发送给我的最佳方式。Mysql:按第二个表中的匹配行数排序结果

表A具有以下的列:

  • ID
  • 名称
  • 描述

表B具有以下的列:

  • ID
  • A_ID(外键表A)
  • IP_ADDRESS
  • 日期

基本上表B包含每次用户从表A浏览量行的行

我的问题是怎么做的我排序表A的结果的基础上,匹配行于表B.

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

谢谢!

+0

你现在的查询有什么问题? – 2010-05-19 21:20:45

+1

哇。我将该查询写为伪代码,但实际上并未考虑对其进行测试。从来没有想过它会实际工作,但我只是测试它,它的作品就像一个魅力! – KyleT 2010-05-19 21:24:59

回答

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中没有行,则省略结果中的行。 – 2010-05-19 21:07:40

+1

@Mark Byers - 修正。 – dcp 2010-05-19 21:08:35

+0

感谢所有人的回答。谢谢dcp,这个工作就像一个魅力! – KyleT 2010-05-19 21:20:42

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中没有行,则会省略结果中的行。 – 2010-05-19 21:07:02

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在ORDER BY,或许这就是你需要:

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; 
相关问题