两个表:
user (id, myValue, ...)
user_preferred (id, userid, preferredValue) fk userid -> user(id)
解释
user是所有用户的表。 user_preferred是任何用户首选值的表。用户可以在user_preferred中多次列出,但必须具有不同的值。查询应返回具有与给定用户的首选值匹配的myValue的所有用户。 $ userid是传递的用户的php变量。
诀窍:
用户可能没有首选项,在这种情况下user_preference表中没有条目。完成上述查询后,如果给定用户没有偏好,我想返回每个用户。
打个比方:
我在酒吧,调酒师问我想要喝什么。我说给我一切符合我偏好的东西。第一轮我说我喜欢蹩脚的啤酒。所以他给了我一个福斯特。第二轮我说我没有偏好,他给了我12品脱,从Bud Light到Guinness。而不是啤酒,这些将是用户。得到它?
查询(目前为止):
SELECT * FROM user WHERE
IF ((SELECT preferredValue FROM user_preferred WHERE userid = $userid) IS NULL,
1,
user.myValue ANY (SELECT preferredValue FROM user_preferred WHERE userid = $userid)
)
其他技巧:
我不想两次运行“SELECT preferredValue FROM user.preferred where id = $ userid”。我可以保存第一个运行时的结果,并以某种方式使用它代替第二个吗?
答案 0 :(得分:2)
SELECT *,(SELECT preferredValue FROM user_preferred WHERE userid = $ userid)AS Result FROM user WHERE
IF(结果为空,1,结果)
答案 1 :(得分:0)
要返回用户列表:
SELECT o.*
FROM `user` o
WHERE o.id IN
( SELECT DISTINCT m.userid
FROM user_preferred m
WHERE EXISTS
( SELECT 1 FROM user_preferred p
WHERE p.preferredValue = m.preferredValue
AND p.userid <> m.userid
AND p.userid = $userid )
)
OR ( o.id <> $userid AND NOT EXISTS
( SELECT 1
FROM user_preferred q
WHERE q.userid = $userid
)
)