2

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

非常感谢

4

2 回答 2

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

于 2012-05-18T15:06:52.813 回答
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 个。然而,在我的情况下,我所拥有的一些“列表”实际上是十万之多,而 MySQL(至少在当时)会扼杀它们。

几点注意事项:

  • 如果这是多个用户可以同时执行此操作的事情,您可能需要使用 TEMPORARY TABLES 来分隔用户。

  • 有时当我向工作表添加多个列时,我从向工作表中添加索引中获得了很好的效果。

于 2012-05-18T15:21:05.457 回答