我有一个mySql表:
id INT(10),
property_id INT(10),
value_id INT(10),
..
有一个索引'组合'在property_id + value_id
我有一个包含例如[1 => 68,4 => 8,9 => 15,......]
而不是此查询:
SELECT * FROM table
WHERE (property_id = 1 && value_id = 68)
|| (property_id = 4 && value_id = 8)
|| (property_id = 9 && value_id = 15)
|| ...
我希望能有所作为:
SELECT * FROM table WHERE combination IN ('1_68', '4_8', '9_15', ...)
我现在知道这不起作用。但是,还有另一种方法可以实现这一目标吗?
答案 0 :(得分:1)
在MySQL中,你可以使用元组作为条件:
SELECT * FROM table
WHERE (property_id, value_id) IN (
(1, 68),
(4, 8),
(9, 15)
);
这是应该如何运作的。但是 - MySQL没有正确使用索引。我们可以希望它能在某一天完成(AFAIK适用于PostgreSQL)。
如果是关于性能而你现在需要它,那么你可以考虑使用indexed virtual (generated) column(MySQL 5.7.8中提供)。
ALTER TABLE `locations`
ADD COLUMN `combination` VARCHAR(21) GENERATED ALWAYS AS CONCAT(property_id, '_', value_id),
ADD INDEX `combination` (`combination`);
现在您可以使用您的查询
SELECT * FROM table WHERE combination IN ('1_68', '4_8', '9_15', ...)
如果要保存一些内存,可以将两个INT组合成一个BIGINT
ADD COLUMN `combination` VARCHAR(21) GENERATED ALWAYS AS ((property_id << 32) + value_id)
您也可以使用UNION ALL
SELECT * FROM table WHERE (property_id, value_id) = (1,68)
UNION ALL
SELECT * FROM table WHERE (property_id, value_id) = (4,8)
UNION ALL
SELECT * FROM table WHERE (property_id, value_id) = (9,15)
这会很快。令人遗憾的是,MySQL并没有进行那种微不足道的优化。
答案 1 :(得分:0)
你能用这个:
SELECT * FROM table WHERE concat(property_id,'_',value_id) IN ('1_68', '4_8', '9_15', ...)