压缩SQL SELECT语句并返回更大的数据集

时间:2015-08-05 23:53:33

标签: mysql sql

我有以下两张表。专辑表和俱乐部表。相册表中的ClubID是参考俱乐部表中主键ClubID的外键。 NumImg表示相册中的图像数量。

Album Table

NumImg  Date        ClubID
------  ----        ------
100 2015-08-01  1
300 2015-08-01  2
350 2015-08-01  3
200 2015-07-31  1
250 2015-07-31  2
400 2015-07-30  3
500 2015-07-30  4

Club Table

ClubID  ClubName
------  ---------
1   bloke
2   luxy entertainment complex
3   t2 lounge
4   gravity

我能够执行下面的5个SQL语句中的每一个来获取我在语句末尾添加的数字(在等于之后)。

SELECT Album.NumImg FROM Album,Club where Album.ClubID=Club.ClubID and Album.Date="2015-08-01" and Club.ClubName="bloke" = 100
SELECT Album.NumImg FROM Album,Club where Album.ClubID=Club.ClubID and Album.Date="2015-08-01" and Club.ClubName="luxy entertainment complex" = 300
SELECT Album.NumImg FROM Album,Club where Album.ClubID=Club.ClubID and Album.Date="2015-08-01" and Club.ClubName="t2 lounge" = 350
SELECT Album.NumImg FROM Album,Club where Album.ClubID=Club.ClubID and Album.Date="2015-07-31" and Club.ClubName="bloke" = 200
SELECT Album.NumImg FROM Album,Club where Album.ClubID=Club.ClubID and Album.Date="2015-07-31" and Club.ClubName="luxy entertainment complex" = 250

我想在尝试降低处理时间时想要做的是尝试将其压缩为一个单独的SQL语句并返回多个数字作为结果并处理它而不是为每个数字单独调用。

接收号码所需的输入是俱乐部名称和专辑的日期。那些可以随时改变。

有谁知道我如何修改上面显示的SQL语句来实现这个目标?

1 个答案:

答案 0 :(得分:4)

MySQL允许IN ()表达式对多个列进行操作,按()分组并用逗号分隔。因此,您可以在单个IN ()子句中列出许多条件,其中每对列必须与这对条件匹配。

SELECT 
  NumImg,
  Date,
  ClubName
FROM
  album
  INNER JOIN club ON album.ClubID = club.ClubID
WHERE 
  (Date, ClubName) IN (
    ('2015-08-01', 'bloke'),
    ('2015-08-01', 'luxy entertainment complex'),
    ('2015-08-01','t2 lounge'),
    ('2015-07-31', 'bloke'),
    ('2015-07-31', 'luxy entertainment complex')
)

这是一个示范:http://sqlfiddle.com/#!9/1dc54/2

我已将DateClubName添加到SELECT列表中,以便更容易在最终结果集中区分它们。我还使用显式FROM替换了隐式内连接(INNER JOIN中的逗号分隔表),因为这是一种更现代的语法。

请注意,这也可以表示为按ANDOR分组的一系列条件。多列IN ()更加整洁,两者可能具有完全相同的性能。

WHERE
  (Date = '2015-08-01' AND ClubName = 'bloke')
  OR (Date = '2015-08-01' AND ClubName = 'luxy entertainment complex')
  OR...

附录

如果没有在ORDER BY中排序的东西,则无法按照指定条件的顺序强制行返回。您可以使用原始查询集并与UNION ALL一起执行。这应该按照指定的顺序返回它们,但是没有匹配任何行的段不会返回空。

SELECT Album.NumImg FROM Album,Club where Album.ClubID=Club.ClubID and Album.Date="2015-08-01" and Club.ClubName="bloke"
UNION ALL
SELECT Album.NumImg FROM Album,Club where Album.ClubID=Club.ClubID and Album.Date="2015-08-01" and Club.ClubName="luxy entertainment complex"
UNION ALL
etc...

也可以通过在ORDER BY内的CASE中再次列出条件来执行此操作,该WHERE (Date, ClubName) IN ( ('2015-08-01', 'bloke'), ('2015-08-01', 'luxy entertainment complex'), ('2015-08-01','t2 lounge'), ('2015-07-31', 'bloke'), ('2015-07-31', 'luxy entertainment complex') ) -- Hack to force the positions, likely to be slow.... ORDER BY CASE WHEN Date = '2015-08-01' AND ClubName = 'bloke' THEN 1 WHEN Date = '2015-08-01' AND ClubName = 'luxy entertainment complex' THEN 2 WHEN Date = '2015-08-01' AND ClubName = 't2 lounge' THEN 3 ... ... ELSE 99999 END ASC 会返回一个字面值来对它们进行排序:

QRunnable