我有一个像这样的SQL查询:
SELECT DISTINCT `User`.*
FROM `user` AS `Users`
WHERE `Users`.`group_id` IN (1,2,3,4,5,6,7,8,9,10........)
我的问题是IN条件可能非常长 我会问,如果没有这个问题,是否有人对替代方法有一些想法? 我的SHOW CREATE TABLE用户是
CREATE TABLE users (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
username char(50) COLLATE utf8_unicode_ci DEFAULT NULL,
password char(40) COLLATE utf8_unicode_ci DEFAULT NULL,
first_name varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
last_name varchar(32) COLLATE utf8_unicode_ci DEFAULT NULL,
email varchar(64) COLLATE utf8_unicode_ci DEFAULT NULL,
group_id int(10) unsigned NOT NULL,
PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=45
DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
非常感谢
答案 0 :(得分:1)
不是通过PHP
在查询之间传递值,而是在MySQL本身(使用JOIN
)中执行:
SELECT DISTINCT `Users`.*
FROM (
SELECT id
FROM your_query
) q
JOIN `user` AS `Users`
ON `Users`.group_id = q.id
在user.group_id
答案 1 :(得分:0)
我为这样的任务创建了处理表,我会截断然后填充我需要用于后续查询的数据。这主要是在非实时情况下完成的,我将数据从一组表移动到另一组表进行报告。
基本上我会做类似的事情:
# clear out the staging table (or maybe create a temporary table if that makes sense for you)
truncate staging_table
# go fetch all the group_id's needed into this staging table
INSERT INTO staging_table table
SELECT distinct group_id
FROM ...
# Now get all the users like so:
SELECT DISTINCT `User`.*
FROM `user` AS `Users`
JOIN staging_table on `Users`.`group_id` = staging_table.group_id;
IN LIST 现已消失,因为基本上所有你想要的group_id都在一个表格中。
这可能会慢一点,因为你把它分成2个而不是1个。然而,在我的情况下,我所拥有的一些“列表”实际上只有10万,而MySQL(至少在当时)会扼杀它们。
一对夫妇注意到:
如果多个用户可以同时执行此操作,您可能需要使用TEMPORARY TABLES来分隔用户。
有些时候,当我向工作表中添加多个列时,我没有为工作表添加索引。