2010-07-22 63 views
1

这是我第一次使用JOIN子句,并且遇到了问题。我想回显我的项目的所有必要信息,但我不明白如何回显一个项目的所有标签,现在,如果为一个项目分配了多个标签,我会得到一个包含项目重复但列表不同的标签的列表项目。有任何想法吗?更好的方法来做到这一点,也非常感谢。SQL JOIN获取项目的名称和所有标签

$query = "SELECT categories.id, categories.category, spots.spot_name, spots.category_id, spots.description, spots.slug, districts.id, districts.district, tags.spot_id, tags.tag ". 
"FROM categories, spots, districts, tags ". 
    "WHERE categories.id = spots.category_id AND districts.id = spots.district_id AND tags.spot_id = spots.id"; 

$result = mysql_query($query); 
if (!$result) { 
    die('Invalid query: ' . mysql_error()); 
} 

while ($row = @mysql_fetch_array($result)){ 
echo '<tr><td style="background:#000; color:#ccc;" class="tooltip" title="'.$row["description"].'Tags: '.$row["tag"].'"><a style="color:#fff;" href="/'.$row["slug"].'">'.$row["spot_name"].'</a></td> 
<td>'.$row["category"].'</td> 
<td>'.$row["district"].'</td> 
<td>****</td> 
</tr> 
'; 
} 

万分感谢,

安德斯

回答

0

更改您的查询,并添加LEFT JOIN这样的: $查询=“选择c.id,c.category,s.spot_name,S .category_id,s.description“。 “s.slug,d.id,d.district,t.spot_id,t.tag”。 “从类别AS c,点AS s,区AS d”。 “JOIN标记AS t ON s.id = t.spot_id”。 “WHERE c.id = s.category_id AND d.id = s.district_id”;

+0

嗨,感谢您的快速回复,但这给了我完全相同的结果我的代码。任何关于如何让所有标签都回应一个项目并且没有重复项目(点)在我的表中回应的建议? – 2010-07-22 07:14:24

+0

哦!抱歉!你是对的。有一个简单的解决方案。你可以在PHP中合并同一个ID的记录:D – 2010-08-01 08:10:17

0

这是您的查询的外观更好看:

SELECT c.id, c.category, s.spot_name, s.category_id, s.description, s.slug, d.id, d.district, t.spot_id, t.tag 
    FROM spots AS s 
    LEFT JOIN categories AS c ON c.id = s.category_id 
    LEFT JOIN districts AS d ON d.id = s.district_id 
    LEFT JOIN tags AS t ON t.spot_id = s.id 

为了让你想发出此查询的所有景点:

SELECT c.id, c.category, s.spot_name, s.category_id, s.description, s.slug, d.id, d.district 
    FROM spots AS s 
    LEFT JOIN categories AS c ON c.id = s.category_id 
    LEFT JOIN districts AS d ON d.id = s.district_id 

现在你也可以遍历所有的斑点和得到他们的标签:

'SELECT t.tag FROM tags WHERE t.spot_id = '. (int)$spot_id 
+0

谢谢,但你在最后一步中的循环意味着什么?你的意思是每次都有一个正常的PHP while循环和一个新的SQL查询吗?这会让所有的事情都变慢吗? – 2010-07-25 07:06:11

+0

是的,那就是我的意思。 2个查询速度较慢,但​​我认为这是唯一的方法,如果你想防止重复的项目。因为当你将一个表全部加入并且一个项目具有多个标签时,它将会出现多少个项目。 – JochenJung 2010-07-25 09:40:18