简体   繁体   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

I'm trying to use this query to select rows with duplicated but with different countries So from these tables 我正在尝试使用此查询来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]

The statics supposed to be 静力学应该是

{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}

I want to get these data like the following HTML structure 我想获取这些数据,例如以下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> 

What i'm tried to use on my query was the following PHP code 我尝试在查询中使用的是以下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>";

But doesn't work as intended at all and gives me a headache trying to fix it, But with no hope. 但是,它根本无法按预期工作,并且让我头疼的要修复它,但是没有希望。

Is there a better way to handle this? 有没有更好的方法来解决这个问题? from SQL side or PHP side or mixed if possible. 从SQL端或PHP端开始,或者尽可能混合使用。

By "rows", I interpret your question as names with multiple counries. 通过“行”,我将您的问题解释为具有多个国家的names If so: 如果是这样的话:

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