我有两张桌子,一张是他们收到的优点,另一张是可能的优点列表,每张都值得一个更大的类别
merit_id
merit_name
merit_desc
cat_id
uid
merit_id
现在发生的事情是在php页面中,用户输入一个catagory,我想显示所述catagory中的所有优点和用户已经拥有的优点,以便首先显示它们。
SELECT * FROM $achiev_table(table1)
LEFT JOIN $user_achiev_table(table2) using(merit_ID)
where $achiev_table.area_id=$area_id
ORDER BY UID DESC
我用于php的查询是如上所述,问题是它不止一次显示优点,如果我添加一个where子句来包含UID ='$ uid'而不显示任何内容。
谢谢。
答案 0 :(得分:2)
要获得用户Y具有的类别X的优点:
SELECT m.merit_id, m.merit_name
FROM merits m
JOIN users_merits um ON m.merit_id = um.merit_id
WHERE m.cat_id = X
AND um.uid = Y
从X类获得所有优点:
SELECT m.merit_id, m.merit_name
FROM merits m
WHERE m.cat_id = X
编辑:要获得X类的所有优点,并显示用户Y已经位于顶部的那些(我猜这就是你的意思):
SELECT m.merit_id, m.merit_name, um.uid as `user`
FROM merits m
LEFT JOIN users_merits um ON m.merit_id = um.merit_id AND um.uid = Y
WHERE m.cat_id = X
ORDER BY user, m.merit_name DESC
说明:
如果要附加记录,LEFT JOIN
会将users_merits表中的记录附加到来自merits表的记录中。
这意味着,对于满足WHERE
子句的 merits 中的每个记录,DB将尝试匹配满足条件的* users_merits *中的记录(或记录)。 ON
条款。
作为LEFT JOIN
(与简单JOIN
不同),即使在* users_merits中没有匹配项,也会显示主表(优点)中的所有记录* - 只要它们满足WHERE
条款。最初我将uid = Y
放在WHERE
子句中,因此未显示用户Y未收到的优点。
最后我们得到一个优点表,所有这些都来自X类,其中一些是由用户Y实现的 - 那些有一个uid附加到他们而其他人有NULL
。 ORDER BY uid
将带有uid的人置于NULL
之上。
P.S。我的SQL比我的英语好,希望这有用:)
答案 1 :(得分:0)
你想从优点表中选择左连接用户表,其中UID = $ uid或UID是空,按uid排序。