使用long long IN条件执行SQL查询的替代方法

时间:2012-05-18 14:49:45

标签: mysql

我有一个像这样的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

非常感谢

2 个答案:

答案 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来分隔用户。

  • 有些时候,当我向工作表中添加多个列时,我没有为工作表添加索引。