我有以下两张表。专辑表和俱乐部表。相册表中的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语句来实现这个目标?
答案 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
我已将Date
和ClubName
添加到SELECT
列表中,以便更容易在最终结果集中区分它们。我还使用显式FROM
替换了隐式内连接(INNER JOIN
中的逗号分隔表),因为这是一种更现代的语法。
请注意,这也可以表示为按AND
和OR
分组的一系列条件。多列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