2010-07-22 2 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

조회를 변경하고 다음과 같이 가입 왼쪽 추가 $ 쿼리 = "c.id, c.category, s.spot_name를 선택,의 .category_id, s.description, ". "s.slug, d.id, d.district, t.spot_id, t.tag". "범주에서 AS c, 반점 AS s, 지구 AS d". "JOIN 태그는 s.id = t.spot_id"로 설정하십시오. "어디에서 c.id = s.category_id 및 d.id = s.district_id";

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 

는이 쿼리 실행하고자하는 모든 장소 얻으려면 :

+0

안녕하세요, 빠른 답장을 보내 주셔서 감사합니다. 그러나 저에게 정확한 결과가 나옵니다. 내 코드. 한 항목에 대해 모든 태그를 에코 할 수 있고 내 테이블에 중복 된 항목 (스팟)이없는 방법에 대한 제안은 무엇입니까? –

+0

오! 죄송합니다! 그래 네가 맞아. 간단한 해결책이 있습니다. PHP에서 동일한 id의 레코드를 병합 할 수 있습니다 : D –

0

이것은 쿼리 읽고 더 나은 모습입니다 이제

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

감사합니다.하지만 마지막 단계에서 루프를 어떻게 의미합니까? 매번 새로운 SQL 쿼리가있는 일반적인 PHP while 루프를 의미합니까? 그 모든 것을 느리게 할 것인가? –

+0

네, 그게 무슨 뜻인지. 2 쿼리는 느리지 만 중복 항목을 방지하려면이 방법이 유일한 방법이라고 생각합니다. 왜냐하면 당신이 하나의 테이블에 모두 가입하고 항목이 여러 태그를 가지고 있기 때문에 그것은 항목만큼 많은 횟수가 발생합니다. – JochenJung