MySQL 查询 IN GROUP_CONCAT 不起作用

Posted

技术标签:

【中文标题】MySQL 查询 IN GROUP_CONCAT 不起作用【英文标题】:MySQL query IN GROUP_CONCAT not working 【发布时间】:2012-07-28 06:35:08 【问题描述】:

mysql 查询出现问题。仅返回结果 GROUP_CONCAT 数组中第一项的结果。即结果数组为 [1,3,4],仅返回用户 id 1 的问卷。

$query_search = "SELECT questionnaires_index.id, questionnaires_index.ea_num, questionnaires_index.address, questionnaires_index.status, questionnaires_index.json_stored, users.username FROM questionnaires_index INNER JOIN users ON users.id = questionnaires_index.interviewer_id WHERE questionnaires_index.interviewer_id IN (SELECT GROUP_CONCAT(id) FROM users WHERE supervisor = (SELECT id FROM users WHERE username = '".$username."'))";

我是否错误地使用了 GROUP_CONCAT?有更好的方法吗?

编辑 1 以下是此查询中使用的 SQL 表

CREATE TABLE IF NOT EXISTS `questionnaires_index` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `ea_num` int(10) unsigned NOT NULL,
  `address` varchar(100) NOT NULL,
  `interviewer_id` int(10) unsigned NOT NULL,
  `status` varchar(30) NOT NULL DEFAULT 'Available',
  `json_stored` tinyint(1) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Dumping data for table `questionnaires_index`
--

INSERT INTO `questionnaires_index` (`id`, `ea_num`, `address`, `interviewer_id`, `status`, `json_stored`) VALUES
(1, 101, '29 De Havilland Crescent Pro Park, Building 1 Persequor Technopark Pretoria 0020', 1, 'Non Contact', 1),
(2, 102, '5th Floor, Imperial Bank Terraces Carl Cronje Drive Tyger Waterfront Bellville 7530', 1, 'Available', 0),
(3, 101, '29 De Havilland Crescent Pro Park, Building 1 Persequor Technopark Pretoria 0020', 3, 'Partially Completed', 0),
(4, 102, '5th Floor, Imperial Bank Terraces Carl Cronje Drive Tyger Waterfront Bellville 7530', 3, 'Available', 0),
(5, 201, '101 test address', 4, 'Available', 0);

对于用户来说:

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  `password` varchar(20) NOT NULL,
  `supervisor` int(10) unsigned NOT NULL,
  `version_code` varchar(10) NOT NULL,
  `is_interviewer` tinyint(1) NOT NULL DEFAULT '0',
  `is_supervisor` tinyint(1) NOT NULL DEFAULT '0',
  `surname` varchar(50) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Dumping data for table `users`
--

INSERT INTO `users` (`id`, `username`, `password`, `supervisor`, `version_code`, `is_interviewer`, `is_supervisor`, `surname`) VALUES
(1, 'Rynardt', 'q', 2, '2.2.0', 1, 0, ''),
(2, 'Herholdt', 'q', 0, '2.2.0', 0, 1, ''),
(3, 'test', 'test', 2, '2.2.0', 1, 0, ''),
(4, 'Botha', 'q', 2, '', 1, 0, '');

编辑 2 有关我正在尝试做的事情的更多信息:

如果您查看我所做的 EDIT,您会看到现在包含 SQL 表。 u.supervisor 是操作类型整数,用于指示用户表中主管条目的 id。 $username 是字符串类型,表示主管的名称。因此,我首先必须获取主管的 id,然后获取所有拥有具有先前找到的 id 的主管的用户的 id。然后使用这个 users.id 数组获取与这些用户关联的所有问卷,并在主管登录时显示给主管。

【问题讨论】:

尝试用id替换GROUP_CONCAT(id) 我无法删除 group_concat,因为有多个用户具有相同的主管 id:(SELECT GROUP_CONCAT(id) FROM users WHERE supervisor = (SELECT id FROM users WHERE username = '".$username. "')) 【参考方案1】:
SELECT GROUP_CONCAT(id) FROM users WHERE supervisor = 
   (SELECT id FROM users WHERE username = '".$username."') 
GROUP BY supervisor

要使用像 group_concat 这样的聚合函数,您需要有一个聚合结果集;)

编辑...嗯...在这种特殊情况下

 WHERE ... IN (SELECT id FROM ...)

应该足够了,不需要拼接结果集

【讨论】:

在测试您的建议时它有效,谢谢。开始使用 GROUP_CONCAT,因为在某些时候我得到了一些关于数组的错误。我猜是因为我当时没有使用IN。【参考方案2】:

首先,您可以在这里完全跳过 GROUP_CONCAT(ID) 并简单地使用 interviewer_id IN ( SELECT ID FROM users [...] )

编辑:由于您使用表格更新了您的帖子,是的 - 那么您很可能需要该子查询。您还可以在附加查询中提取主管的 ID,并可以在此处跳过嵌套 sql。 或者,既然您说主管登录并且必须查看获取的数据......也许还可以将用户 ID 保存到您的会话中(我猜它来自那里?)并通过添加完全跳过子查询和附加查询用户 ID 到您的登录脚本创建会话变量。

顺便说一句……您至少应该使用 md5 或 sha 对密码进行哈希处理。 好主意是保存用户注册的时间,并在散列并将密码保存到表之前使用时间戳 + 一个常量来加盐密码。

【讨论】:

如果您查看我所做的编辑,您会看到现在包含 SQL 表。 u.supervisor 是操作类型整数,用于指示用户表中主管条目的 id。 $username 是字符串类型,表示主管的名称。因此,我首先必须获取主管的 id,然后获取具有先前找到的 id 的主管的所有用户的 id。然后使用这个 users.id 数组获取与这些用户关联的所有问卷,并在主管登录时显示给主管。

以上是关于MySQL 查询 IN GROUP_CONCAT 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 IN 子句 Mysql 中使用 GROUP_CONCAT 结果

MYSQL GROUP_CONCAT 和 IN

mysql GROUP_CONCAT 查询某个字段(查询结果默认逗号拼接)

在 mysql WHERE 子句中使用 GROUP_CONCAT 和 FIND_IN_SET

mysql in子查询的优化

MySql 递归查询