遇到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 有关我想要做的更多信息:
如果查看我编写的编辑,您将看到现在包含SQL表。 u.supervisor是op类型整数,表示users表中supervisor条目的id。 $ username的类型为string,表示主管的名称。因此,我首先必须得到主管的id,然后获得具有以前找到的id的主管的所有用户的id。然后使用这个users.id数组获取与这些用户相关的所有问卷,并在登录时将其显示给主管。
答案 0 :(得分:0)
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 ...)
应该足够,不需要连接结果集
答案 1 :(得分:0)
首先,您可以完全跳过GROUP_CONCAT(ID)并简单地使用 interviewer_id IN(SELECT ID FROM users [...])
编辑:既然您使用表更新了帖子,那么 - 很可能您需要该子查询。您还可以在其他查询中提取主管的ID,并可以在此处跳过嵌套-sql。 或者,既然您说主管登录并且必须查看所获得的数据...也可以将用户ID保存到您的会话中(我猜它来自那里?)并完全跳过子查询和其他查询只需添加user-id到登录脚本创建会话变量。
只是旁注...你至少应该用md5或sha来哈希密码。 好主意是节省用户注册的时间,并在散列和保存密码到表之前使用时间戳+常量来设置密码。