【发布时间】:2018-12-13 11:46:03
【问题描述】:
我需要根据另一个表中的值从一个表中检索共享值,但不要显示重复项。
我有哪些表的示例...
表格 - 成员
+-----------------+
| ID | NAME |
+-----------------+
| 1 | Bob |
| 2 | Jack |
| 3 | Jane |
| 4 | Bruce |
| 5 | Clark |
| 6 | Peter |
+-----------------+
表格 - 组
+--------------------------------+
| ID | NAME | MANAGER_ID |
+--------------------------------+
| 1 | Group A | 1 | (Bob)
| 2 | Group B | 2 | (Jack)
| 3 | Group C | 1 | (Bob)
+--------------------------------+
表格 - group_members
+--------------------------------+
| ID | GROUP_ID | MEMBER_ID |
+--------------------------------+
| 1 | 1 | 3 | (Group A - Jane)
| 2 | 1 | 4 | (Group A - Bruce)
| 3 | 1 | 5 | (Group A - Clark)
| 4 | 1 | 6 | (Group A - Peter)
| 5 | 2 | 3 | (Group B - Jane)
| 6 | 3 | 4 | (Group B - Bruce)
| 7 | 3 | 5 | (Group C - Clark)
+--------------------------------+
我需要什么
(注意:我在此处的查询中使用 * 来缩短代码。)
如果“Bob”看到他的所有组。
查看“group_members”表并显示属于它的所有成员...
$q = SELECT * FROM groups WHERE manager_id = $id;
$r = mysqli_query($dbc, $q);
while ($row = mysqli_fetch-assoc($r) {
$q2 = SELECT *, count(MEMBERS_ID) AS group_count FROM group_members LEFT JOIN members ON group_members.MEMBER_ID = members.id WHERE group_id = '$row[GROUP_ID]';
$r2 = mysqli_query($dbc, $q2);
while ($row2 = mysqli_fetch-assoc($r2) {
echo $row2['name'];
}
}
这会按预期显示列表。
+------------------------+
| NAME | GROUP COUNT |
+------------------------+
| Jane | 1 |
| Bruce | 1 |
| Clark | 1 |
| Peter | 1 |
| Bruce | 1 |
| Clark | 1 |
+------------------------+
我将GROUP BY group_members.group_id 添加到我的第二个查询中并显示。
+------------------------+
| NAME | GROUP COUNT |
+------------------------+
| Jane | 1 |
| Bruce | 2 |
| Clark | 2 |
| Peter | 1 |
+------------------------+
这是完美的......但这是问题
如果我添加一个WHERE members.name LIKE \'%clark%\' 然后它输出...
+------------------------+
| NAME | GROUP COUNT |
+------------------------+
| | |
| | |
| Clark | 1 |
| | |
| | |
| Clark | 1 |
+------------------------+
它忽略 GROUP BY 并在其他条目会显示的地方显示空白行。
说了这么多。请问有谁知道原因或更好的方法吗?
已经有一段时间了,非常感谢任何帮助。
已编辑:
这是包含所有使用列的完整查询:
$q = SELECT * FROM groups WHERE manager_id = $id;
$r = mysqli_query($dbc, $q);
while ($row = mysqli_fetch-assoc($r) {
$q2 = SELECT members.id) AS memid, members.first, members.last, members.comname, members.email, members.sector, (members.status) AS memstatus, (group_members.id) AS groupid, (group_members.member_id) AS memidgroup, group_members.group_id, COUNT(group_members.member_id) AS groupcount, member_roles.role FROM members LEFT JOIN group_members ON members.id = group_members.member_id LEFT JOIN member_roles ON members.role_id = member_roles.id WHERE group_id = '$row[GROUP_ID]' AND members.name LIKE '%clark%' GROUP BY group_members.group_id;
$r2 = mysqli_query($dbc, $q2);
while ($row2 = mysqli_fetch-assoc($r2) {
echo $row2['name'];
}
}
【问题讨论】:
-
您要将
WHERE members.name ...添加到哪个SQL 语句中?显示您遇到问题的完整 SQL 语句可能更有用 -
请显示实际的查询,并且只显示查询(PHP 代码在这里几乎没有相关性。)“我在查询中使用 * 来缩短代码。” -不要,因为这使我们无法判断您是否在此处正确使用 GROUP BY。 (在 SQL 中不允许选择不属于分组的列,即使您在容错模式下运行 MySQL 并接受它,您也可能不会得到您想要的结果。)
-
完整查询请查看已编辑部分