2017-09-24 181 views
0
SELECT 
    a.FirstName, 
    a.LastName, 
    c.Country, 
    SUM(b.Scores) AS Score 
FROM names a 
INNER JOIN countries c 
    ON a.id = c.cid 
INNER JOIN scores b 
    ON a.id = b.sid 
WHERE a.id = :id 
GROUP BY c.Country 
ORDER BY Score ASC 

我試圖用這個查詢select行與duplicated但是從這些表選擇只有一個不同的列,組重複的行它

  names       countries      scores 
[id -- FirstName -- LastName] [id -- cid -- Country]  [id -- sid -- Score] 
[1 -- FName1 -- LName1 ] [1 -- 1 -- USA ]  [1 -- 1 --  5] 
[2 -- FName2 -- LName2 ] [2 -- 1 -- France ]  [2 -- 1 --  6] 
[3 -- FName3 -- LName3 ] [3 -- 1 -- Germany]  [3 -- 2 --  7] 
[4 -- FName4 -- LName4 ] [4 -- 2 -- Germany]  [4 -- 2 --  8] 
            [5 -- 2 -- Czech ]  [5 -- 2 --  2] 
            [6 -- 3 -- Germany]  [6 -- 4 --  10] 
            [7 -- 4 -- France ]  [7 -- 3 --  15] 

的靜態應該是不同countries所以

{id[1] -> FName1 -> LName1}--{cid[1] -> USA, France, Germany}--{sid[1] -> 11} 
{id[2] -> FName2 -> LName2}--{cid[2] -> Czech , Germany}--{sid[2] -> 17} 
{id[3] -> FName3 -> LName3}--{cid[3] ->  Germany  }--{sid[3] -> 10} 
{id[4] -> FName4 -> LName4}--{cid[4] ->  France  }--{sid[4] -> 15} 

我希望得到這些數據,如下面的HTML結構

.Container div { 
 
    border: 1px solid blue; 
 
    margin: 10px; 
 
} 
 
.Container div div { 
 
    border: 1px solid red; 
 
    margin: 10px; 
 
}
<div> 
 
    <div id="Master German">German</div> 
 
    <div id="German"> 
 
     <div class="Container"> 
 
      <div id='FName2 German'> 
 
       <div>FName2</div> 
 
       <div>LName2</div> 
 
      </div> 
 
      <div id='FName1 German'> 
 
       <div>FName1</div> 
 
       <div>LName1</div> 
 
      </div> 
 
      <div id='FName3 German'> 
 
       <div>FName3</div> 
 
       <div>LName3</div> 
 
      </div> 
 
     </div> 
 
    </div> 
 

 
    <div id="Master France">France</div> 
 
    <div id="France"> 
 
     <div class="Container"> 
 
      <div id='FName4 France'> 
 
       <div>FName4</div> 
 
       <div>LName4</div> 
 
      </div> 
 
      <div id='FName1 France'> 
 
       <div>FName1</div> 
 
       <div>LName1</div> 
 
      </div> 
 
     </div> 
 
    </div> 
 

 
    <div id="Master Czech">Czech</div> 
 
    <div id="Czech"> 
 
     <div class="Container"> 
 
      <div id='FName2 Czech'> 
 
       <div>FName2</div> 
 
       <div>LName2</div> 
 
      </div> 
 
     </div> 
 
    </div> 
 
    
 
    <div id="Master USA">USA</div> 
 
    <div id="USA"> 
 
     <div class="Container"> 
 
      <div id='FName1 USA'> 
 
       <div>FName1</div> 
 
       <div>LName1</div> 
 
      </div> 
 
     </div> 
 
    </div> 
 
</div>

什麼,我想在我的查詢中使用了下面的代碼PHP

$pre = null; 
echo "<div>"; 
$end = ""; 
while ($row = $stmt->fetch()) { 
    $FName = $row['FirstName']; 
    $LName = $row['LastName']; 
    $Country = $row['Country']; 

    if ($Country != $pre) { 
     echo $end; 
     echo "<div id='Master $Country'>$Country</div>"; 
     echo "<div id='$Country'>"; 
    } 
    $end = "</div> 
</div>"; 
    $pre = $Country; 

    echo " 
<div id='$FName USA'> 
    <div>$FName</div> 
    <div>$LName</div> 
</div>"; 
} 
echo $end; 
echo "</div>"; 

但隨着預期都不起作用,讓我頭疼試圖修復它,但沒有希望。

有沒有更好的方法來處理這個問題?從SQL方面或PHP方面或如果可能混合。

回答

1

「行」,我把你的問題解釋爲names與多個議員。如果是這樣的話:

SELECT n.FirstName, n.LastName, 
     GROUP_CONCAT(DISTINCT c.Country) as countries, SUM(s.Scores) AS Score 
FROM names n INNER JOIN 
    countries c 
    ON n.id = c.cid INNER JOIN 
    scores s 
    ON n.id = s.sid 
WHERE n.id = :id 
GROUP BY n.id, n.FirstName, n.LastName 
HAVING COUNT(DISTINCT c.country) > 1 
ORDER BY Score ASC; 
+0

此解決方案是否需要對PHP代碼進行一些更改以使用'foreach($ countries as $ country)'?因爲如果我只是將'countries'定義爲變量,我只能得到一個ID爲'French,German'的HTML'div'。 – AXAI

+0

此外,我沒有得到任何價值,除非存在重複。所以我把'HAVING'改爲'> 0'並且回到了前面的問題。 – AXAI