2014-04-26 4 views
0

데이터베이스에 두 개의 테이블이 있습니다. "region"과 "attraction"입니다. 나는 그들 둘 다로부터 데이터를 얻을 것 인 JOIN 질의를 만들었고 그것을 표시했다. 여기 내 코드입니다 :MySql 여러 테이블의 데이터를 한 번만 표시하는 방법은 무엇입니까?

$regionsId = $_GET['region']; 

//$sql = "SELECT `RegionID`, `RegionName` FROM `region` WHERE `RegionID`='$regionsId'"; 
//$sql = "SELECT `AttractionID`, `Name`, `imglink2` FROM `attractions` WHERE `RegionID`='$regionsId'"; 

$sql ="SELECT * 
FROM region 
INNER JOIN attractions WHERE region.RegionID = '$regionsId' AND attractions.RegionID = '$regionsId'"; 


$result = mysql_query($sql, $link); 

if (!$result) { 
    echo "DB Error, could not query the database\n"; 
    echo 'MySQL Error: ' . mysql_error(); 
    exit; 
} 



while ($row = mysql_fetch_assoc($result)) { 

    echo $row['RegionName']; 

    echo "<a href='attraction.php?village=" . $row['AttractionID'] . "'>" . "<br />" . 
      $row['Name'] . 
      "<br />" . 

     "<img src='" . $row['imglink2'] . "' height='130' width='150'> 

     </a>"; 



} 





mysql_free_result($result); 



?> 

내 문제는 내가 그에게 에코 $ 행 [ 'RegionName이를'] 표시 할 때; 내가 보여주고있는 모든 매력과 함께 여러 번 표시됩니다. 한 번만 표시되도록하려면 어떻게해야합니까? 감사합니다.

+1

이동 봐 구문을 결합하십시오 – Strawberry

+0

그럼 당신은 너무 많은 도움 덕분에 .... – user3565574

답변

0

시도 GROUP BY

$sql =" 
SELECT * 
FROM region 
LEFT JOIN attractions ON region.RegionID = attractions.RegionID 
WHERE region.RegionID = '$regionsId' 
    AND attractions.RegionID = '$regionsId' 
GROUP BY region.RegionID" ; 
+0

이것은 하나의 매력을 표시합니다. – user3565574

+0

좋아 .. 'SELECT * 지역 왼쪽에서는 region.RegionID = attractions.RegionID WHERE region.RegionID ='$ regionsId ' 및 attractions.RegionID ='$ regionsId ' '보십시오이 –

+0

아니,이 ON 명소 가입 너무 효과가 없습니다. while 루프에서 RegionName을 꺼내면 전혀 표시되지 않습니다. 나는 손실에 ... – user3565574

0

사용이 :

$sql = "SELECT DISTINCT * 
FROM region 
    LEFT JOIN attractions ON region.RegionID = attractions.RegionID 
WHERE region.RegionID = '$regionsId' 
    AND attractions.RegionID = '$regionsId' 
GROUP BY region.RegionID"; 
+0

너무 작동하지 않습니다. – user3565574

0

이 조금 긴 코멘트입니다. 이 양식에 당신이 그것을 원하는 경우

region  attraction 
    A   1 
    A   2 
    A   3 
    B   1 
    B   5 

: SQL 완전히 채워 모든 "세포"를 테이블 형식으로 값을 반환합니다

A   1,2,3 
    B   1,5 

그런 다음 데이터베이스가 적절하다 :

SELECT r.*, group_concat(a.AttractionId) 
FROM region r LEFT JOIN 
    attractions a 
    ON r.RegionID = a.RegionID 
WHERE r.RegionID = '$regionsId' 
GROUP BY r.RegionID; 

이 양식으로 원한다면 :

region  attraction 
    A   1 
       2 
       3 
    B   1 
       5 

그런 다음 응용 프로그램 계층에서 작업을 수행해야합니다. 데이터베이스에이를 설정할 수는 있지만 테이블을 처리 할 때 SQL의 특성을 "위반"합니다. 그리고 결과를 표시 할 때 루프를 반복하는 것이 매우 쉽습니다.

0
지역의 변화를보고 변경과 같이 발생하는 경우에만 표시 할 쿼리에 order by RegionName를 추가 한 다음, 코드를 변경하는 것입니다 갈

간단한 방법 : 기본에서 다시

$prevRegionName = ''; // fill variable with something that won't be matched in first comparison 

while ($row = mysql_fetch_assoc($result)) { 

    $currentRegionName = $row['RegionName']; // push current region to variable 
    if ($currentRegionName != $prevRegionName) echo $row['RegionName']; // print region only if it changed 

    echo "<a href='attraction.php?village=" . $row['AttractionID'] . "'>" . "<br />" . 
      $row['Name'] . 
      "<br />" . 

      "<img src='" . $row['imglink2'] . "' height='130' width='150'> 

     </a>"; 


    $prevRegionName = $currentRegionName; // save current region to compare it in next interaction 
    } 
+0

완벽한 !!! 고마워요 !!! – user3565574

+0

당신이 찾고있는 답변이 내 대답이라고 생각하면 그것을 하나의 것으로 표시하십시오. –

관련 문제