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 - 从另一个表中检索共享值与预期不同的主要内容,如果未能解决你的问题,请参考以下文章
如何从另一个表中检索并再次将其输入到 laravel 中的另一个表中?