PHP SQL - 从另一个表中检索共享值与预期不同

Posted

技术标签:

【中文标题】PHP SQL - 从另一个表中检索共享值与预期不同【英文标题】:PHP SQL - Retrieve shared values from a another table not as expected 【发布时间】: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 并接受它,您也可能不会得到您想要的结果。) 完整查询请查看已编辑部分 【参考方案1】:

您的疑问或问题没有完全说明。人们无法猜测或假设。 发布您的最后一个查询以及所有查询不要担心节省空间。 那些空白行有数据说明它们为什么在表中。

根据您的解释或您的疑问,这是我的简单回答

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 表中选择数据。

【讨论】:

完整查询请查看已编辑部分

以上是关于PHP SQL - 从另一个表中检索共享值与预期不同的主要内容,如果未能解决你的问题,请参考以下文章

插入触发器 SQL。插入新表后如何从另一个表中检索值

基于从另一个表中选择的值进行限制

从另一个表中删除 ID 不匹配的 sql 行

如何从另一个表中检索并再次将其输入到 laravel 中的另一个表中?

Oracle SQL:从一个表中选择一个计数,从另一个表中使用子查询缩小选择范围

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回