【发布时间】:2014-03-12 10:55:02
【问题描述】:
我的问题(可能)有点复杂,我试着把它写下来,以便理解。 我在 PHP 中有一个类,它根据几种情况和参数生成 MySQL 查询(然后在 dinamyc 表中显示查询结果)。 例如,这里是表格和示例查询:
很简单,有用户,每个用户可以分配一个或多个配置文件。 例如,我们只有一个用户,他有两个个人资料:
[USER]
userid login password status reg_date
------ ------- ---------- ------ -------------------
1 JohnDoe hd98349... 0 2014-01-09 16:00:55
[PROFILE]
profile_id profile_name
---------- ------------
1 admin
2 root
3 user
[USER_PROFILE]
relation_id user profile
----------- ----- -------
1 1 1
2 1 2
我的 PHP 代码会生成一个如下所示的查询:
SELECT
userid AS 'User id',
login AS 'User name',
GROUP_CONCAT(profile_name SEPARATOR ', ') AS 'Profile(s)',
`status`
FROM `user` LEFT JOIN user_profile ON `user`.userid = user_profile.`user`
LEFT JOIN `profile` ON user_profile.`profile` = `profile`.profile_id
WHERE
status IN (0, 1)
ORDER BY reg_date ASC
LIMIT 0 ,10
这个查询的结果是:
[RESULT]
User id User name Profile(s) status
------- --------- ---------- ------
1 JohnDoe root, admin 0
当我想对源自子查询或复杂表达式(如 GROUP_CONCAT(profile_name SEPARATOR ', '))的列使用过滤器时,我得到错误的结果:
SELECT COUNT(*) AS 'all_rows'
FROM `user` LEFT JOIN user_profile ON `user`.userid = user_profile.`user`
LEFT JOIN `profile` ON user_profile.`profile` = `profile`.profile_id WHERE status IN (0, 1)
HAVING GROUP_CONCAT(profile_name SEPARATOR ', ') LIKE '%root%'
这将导致:'all_rows' => 2。 这是因为 HAVING 中的 GROUP_CONCAT 不会分组,但是如果我将它放在 SELECT 中,例如: SELECT COUNT(GROUP_CONCAT(profile_name SEPARATOR ', ')) 我会收到错误
所以问题是如何在过滤器(WHERE / HAVING)表达式中使用 GROUP_CONCAT 获取所有行数?
编辑:在我运行主查询之前,我需要知道它会产生多少记录行,没有 LIMIT 限制。我使用它来计算 LIMIT 的起始行值以用于分页目的。
【问题讨论】:
-
你能在 SQL Fiddle (www.sqlfiddle.com) 上进行设置吗?
-
就个人而言,我倾向于完全避免使用 GROUP_CONCAT(和 CONCAT)。我更喜欢在应用程序级别处理给定问题的这些方面。
-
您的查询中没有
GROUP BY子句。因此,您将所有与WHERE条件匹配的行聚合成一个结果。 -
SQL_CALC_FOUND_ROWS选项不能解决您遇到的问题吗?