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

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表中的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
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再次指定条件,但这也不会很快,而且非常难看。我希望我能在这个领域被雇佣,仅仅是为了提出好的问题。要是有黄金解决方案就好了。仅仅考虑联合和用例可能不会使查询运行得更快。