PHP SQL-无法从另一个表中检索共享值

时间:2018-12-13 11:46:04

标签: php sql mysqli

我需要基于另一个表中的值从表中检索共享值,但不要显示重复项。

我有哪些表的示例...

表-成员

+-----------------+
| 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)
+--------------------------------+

我需要什么

注意:我在此处的查询中使用*来缩短代码。)

如果“鲍勃”看到了他所有的小组。

查看“ 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'];
    } 
}

1 个答案:

答案 0 :(得分:0)

您的查询或问题未完全陈述。人们无法猜测或假设。 发布您的最后一个查询,以及所有查询都不必担心节省空间。 这些空白行具有其为何在表中的数据。

根据您的解释或查询,这是我的简单答案

SELECT id,
(select groups.id from groups where groups.id = group_members.group_id )AS group_members_id, 
(select groups.name from groups where groups.id = group_members.group_id )AS group_members_name,  
(select members.id from members where members.id =  group_members.member_id )AS members_id, 
(select members.name from members where members.id =  group_members.member_id )AS members_name,
count((select members.id from members where members.id =  group_members.member_id ) )as members_id_count FROM group_members WHERE (select members.name from members where members.id =  group_members.member_id ) LIKE '%clark%' group by members_id

您提到的

  

WHERE members.name LIKE \'%clark%\'

您正在从members表中选择数据,而必须从group_members表中选择数据。