从两个subquerys的两列不同的顺序排序

时间:2015-05-24 08:14:34

标签: mysql sql sql-server

我有两张桌子

Table1 with columns
    f_id, a_id

Table2 with columns
    a_id, a_name

我正在尝试查找一个查询,我可以通过两个子类中f_id的计数差来订购a_id s。子查询1基本上类似于:

SELECT f_id,
       count(a_id) 
FROM Table1 
GROUP BY f_id

虽然Subquery 2看起来有点像这样:

SELECT Table1.f_id, 
       count(Table1.a_id) 
FROM Table1, Table2 
WHERE
     Table1.a_id = Table2.a_id 

WHERE Table2.a_name= "User Input1" OR "User Input2" 
GROUP BY f_id

现在主要的查询应该按照子序列的数量来计算f_id的{​​{1}},我希望你能得到这个想法,即使我可能没有很好地解释它

样本数据和所需的输出:

Table1

现在考虑用户输入是bar,我也希望得到以下输出

Table1 with columns
    f_id, a_id
    5,    3
    5,    4
    6,    2
    6,    3

Table2 with columns
    a_id, a_name
    2,    "foo"
    3,    "bar"
    4,    "too"

1 个答案:

答案 0 :(得分:1)

如果我理解正确,这就是你要找的东西:

SELECT t1.f_id, (t1.cnt1 - t2.cnt2) AS DifferenceOfCount
FROM (SELECT f_id, COUNT(a_id) AS cnt1
      FROM Table1 
      GROUP BY f_id) t1
INNER JOIN (SELECT Table1.f_id AS f_id, COUNT(Table1.a_id) AS cnt2
            FROM Table1 
            INNER JOIN Table2 
            ON Table1.a_id=Table2.a_id 
            WHERE Table2.a_name= "foo" OR table2.a_name = "bar" 
            GROUP BY f_id) t2
ON t1.f_id = t2.f_id
ORDER BY DifferenceOfCount

以下是SQL Fiddle,因此您可以看到它是如何工作的。

您应该注意到我使用INNER JOIN语法来连接两个表而不是旧时尚方式(这样做更好的做法......)

此外,如果此查询将采用用户输入,我认为您应该为此创建存储过程...看起来如何看到HERE

注意:这是MySQL,但类似的东西(可能在Sql Server中也是如此),我不太清楚你使用了什么,因为你标记了它们......

GL!