MySQL查询显示来自连接表的数据

时间:2011-03-06 14:19:18

标签: php mysql

我有两张桌子,一张是他们收到的优点,另一张是可能的优点列表,每张都值得一个更大的类别

表1

merit_id
merit_name
merit_desc
cat_id

表2

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'而不显示任何内容。

谢谢。

2 个答案:

答案 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附加到他们而其他人有NULLORDER BY uid将带有uid的人置于NULL之上。

P.S。我的SQL比我的英语好,希望这有用:)

答案 1 :(得分:0)

你想从优点表中选择左连接用户表,其中UID = $ uid或UID是空,按uid排序。