簡體   English   中英

選擇只有一個不同列的重復行並將其分組

[英]Select Duplicated Rows with only one different Column And Group it

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但具有不同countries行,因此從這些表中進行選擇

           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]

靜力學應該是

{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端開始,或者盡可能混合使用。

通過“行”,我將您的問題解釋為具有多個國家的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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM