Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何确定两个用户是否共享某些信息而无需进行多次查询_Php_Mysql_Join - Fatal编程技术网

Php 如何确定两个用户是否共享某些信息而无需进行多次查询

Php 如何确定两个用户是否共享某些信息而无需进行多次查询,php,mysql,join,Php,Mysql,Join,我正在尝试解决如何允许一个用户[V]访问另一个用户的个人资料[a],查看用户[a]所在的所有组,以及他们都属于哪些组 各表如下: USERS TABLE user_id | name | email.... 1 | Drent | drents... [V] 2 | Dude2 | dude2@... [A] 3 | Dude3 | dude3@... GROUPS TABLE group_id | group_name | joining_polic

我正在尝试解决如何允许一个用户[V]访问另一个用户的个人资料[a],查看用户[a]所在的所有组,以及他们都属于哪些组

各表如下:

USERS TABLE
user_id | name  | email....
1       | Drent | drents... [V]
2       | Dude2 | dude2@... [A]
3       | Dude3 | dude3@...

GROUPS TABLE
group_id | group_name   | joining_policy
1        | The Crazies  | invite_only
2        | Team OSM     | open
3        | My Group     | approval_needed

GOUP_USERS TABLE
group_id | user_id
1        | 1
1        | 2
3        | 2
2        | 1
2        | 3
我可以对用户[a]所属的所有组进行常规查询:

SELECT groups.group_name FROM groups JOIN group_users 
ON groups.group_id=group_users.group_id WHERE group_users.user_id=2 LIMIT 0,10
这当然会返回这个:

The Crazies - <a href="$row['group_id']?join=$my_user_id>Join This Group</a>
My Groups - <a href="$row['group_id']?join=$my_user_id>Join This Group</a>
但我知道这行不通

任何帮助都将不胜感激

SELECT  g.*, guv.group_id IS NOT NULL AS is_member
FROM    group_users gua
JOIN    group g
ON      g.id = gua.group_id
LEFT JOIN
        group_users guv
ON      guv.group_id = gua.group_id
        AND guv.user_id = $v
WHERE   gua.user_id = $a

列AlreadyMember是布尔类型(真/假)

您尝试过相交吗?通过这种方式,为一个用户选择组+合并所需的工作量增加了一倍,这看起来相当不错。@t.dubrownik:
MySQL
不支持
INTERSECT
。谢谢。这是可行的,但我发现另一个解决方案更容易理解:)
SELECT groups.group_name FROM groups JOIN group_users  
ON groups.group_id=group_users.group_id JOIN users AS visitor 
ON visitor.user_id=group_users.user_id WHERE group_users.user_id=2 LIMIT 0,10
SELECT  g.*, guv.group_id IS NOT NULL AS is_member
FROM    group_users gua
JOIN    group g
ON      g.id = gua.group_id
LEFT JOIN
        group_users guv
ON      guv.group_id = gua.group_id
        AND guv.user_id = $v
WHERE   gua.user_id = $a
SELECT A.group_name, (u.user_id is not null) as AlreadyAMember
FROM
(
SELECT groups.group_id, groups.group_name
FROM groups
JOIN group_users ON groups.group_id=group_users.group_id
WHERE group_users.user_id= $A
LIMIT 0,10
) A
LEFT JOIN group_users u ON u.group_id=A.group_id and u.user_id= $V