Mysql 压缩SQL SELECT语句并返回较大的数据集
我有以下两张桌子。相册桌和俱乐部桌。Album表中的ClubID是一个外键,它引用Club表中的主键ClubID。NumImg表示相册中的图像数Mysql 压缩SQL SELECT语句并返回较大的数据集,mysql,sql,Mysql,Sql,我有以下两张桌子。相册桌和俱乐部桌。Album表中的ClubID是一个外键,它引用Club表中的主键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 50
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语句来实现这一点吗?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')
)
下面是一个演示:
我在选择列表中包含了日期和俱乐部名称,以便在最终结果集中更容易区分它们。我还用显式内部联接替换了中的隐式内部联接逗号分隔表,因为这是一种更现代的语法
请注意,这也可以表示为按AND和OR分组的条件链。中的多列更加整洁,两个可能具有完全相同的性能
WHERE
(Date = '2015-08-01' AND ClubName = 'bloke')
OR (Date = '2015-08-01' AND ClubName = 'luxy entertainment complex')
OR...
补遗
如果没有某种排序依据,就无法强制行按照您指定的条件顺序返回。您可以使用原始查询集并与UNIONALL一起执行它们。这将按指定的顺序返回它们,但不匹配任何行的段不会返回空
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...
也可以通过在返回文本值的情况下按顺序再次列出条件来完成:
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
我不认为一个人可以在中使用多个列。我会试试看我能想出什么,有没有一种方法可以按照我用一条语句请求的顺序返回数据,因为我可以通过发出单独的selects命令按我想要的顺序接收结果,但是有没有一个关键字或其他东西可以让我用一条SQL语句按相同的顺序接收数据?@Mike你不能强制这些命令按特定的顺序返回。您可以使用原始的多个查询集,而不是单独执行它们,而是通过UNION ALL连接每个查询。这将获得所需的顺序,但不是将它们与IN组合后的性能增益。我想您可以按顺序按with CASE再次指定条件,但这也不会很快,而且非常难看。我希望我能在这个领域被雇佣,仅仅是为了提出好的问题。要是有黄金解决方案就好了。仅仅考虑联合和用例可能不会使查询运行得更快。