我有一个Web(Intranet)工具,可以将用户列表解析为名字和姓氏数组。然后我循环遍历该数组(可能是50次),如:
SELECT * FROM users WHERE last_name = array[x].last AND first_name = array[x].first
是否有可能以某种方式同时查询所有这些名字/姓氏组合,就像具有两个属性的IN
语句一样。
如果可能的话,我会喜欢的是一个单个查询返回找到的每个匹配的记录集(我想这是一个带有2个属性的IN语句)。我对MySQL并不是那么好,但我的猜测就是让子查询收集任何名字匹配的列表,然后收集任何姓氏匹配的另一个子查询。
你知道我实际上是在那里查询为where first_name IN () OR last_name in ()
我有一个结果集有任何可能的匹配,然后我可以循环遍历该结果集,最后检查名字和姓氏的位置比赛。这个数据库很快,但它很庞大。例如,有8,000多个用户
答案 0 :(得分:1)
这是MySQL row constructors的一个很好的技巧:
CREATE TABLE users (
first VARCHAR(50),
last Varchar(50)
);
INSERT INTO users (first, last) VALUES
('Bill', 'Gates'), ('Steve', 'Jobs'), ('Jon', 'Skeet');
SELECT *
FROM users
WHERE (first, last) = ('Bill', 'Gates')
OR (first, last) = ('Steve', 'Jobs')
OR (first, last) = ('Jon', 'Skeet');
http://sqlfiddle.com/#!2/6ef9a/2
它也适用于IN
:
SELECT *
FROM users
WHERE (first, last) IN(
('Bill', 'Gates'), ('Steve', 'Jobs'), ('Jon', 'Skeet')
);
答案 1 :(得分:0)
您可以UNION
一起单独的SQL查询并获得一个结果集。
SELECT * FROM users WHERE last_name = array[0].last AND array[0].first = first_name
UNION
SELECT * FROM users WHERE last_name = array[1].last AND array[1].first = first_name
UNION
SELECT * FROM users WHERE last_name = array[2].last AND array[2].first = first_name
答案 2 :(得分:0)
您可以先将名称连接起来然后使用IN子句。
SELECT * FROM users WHERE CONCAT_WS('|', last_name, first_name) IN (...);
答案 3 :(得分:0)
nameKey
列(字符串)添加到表IN()
子句中提供连接的“lastName | firstName”键。