繁体   English   中英

如何同时使用DISTINCT行和非DISTINCT行

[英]How to both use a DISTINCT row and a non DISTINCT row

所有! 我今天有一个棘手的问题,我想使用select DISTINCT语句既选择需要区分的行,又选择同一条语句(或我尝试过的方式?) 't /无法区分。 我想要的结果是每个类名只有一个。 当前它的输出是这样的:

English: textbook, folder, laptop
English: textbook
Media:   textbook, folder
English: textbook, folder
English: textbook, folder
Art:     textbook

这就是我希望它输出的方式:

English: textbook, folder, laptop
Media:   textbook, folder
Art:     textbook

这是数据库的布局:

|ID|classname|Book  
|49|English  |textbook, folder, laptop
|50|English  |textbook  
|53|Media    |textbook, folder 
|54|English  |textbook, folder 
|55|Art      |folder 

我显然是php的新手,因此不胜感激!

到目前为止,这是我的方法:

$sql = "SELECT DISTINCT classname FROM classes ORDER BY Due;";
$result1 = mysqli_query($conn, $sql);
$resultCheck = mysqli_num_rows($result1);
if ($resultCheck > 0){
    while ($row = mysqli_fetch_assoc($result1)){
        $classname = $row["classname"];

        if ($classname == "English"){
            $newName = $classname;
            $sql = "SELECT Book FROM classes WHERE Book='$newName';";
            $result1 = mysqli_query($conn, $sql);
            $resultCheck = mysqli_num_rows($result1);

            if ($resultCheck > 0){
                while ($row = mysqli_fetch_assoc($result1)){
                    $materials = $row["Book"]; 
                    echo "<div class='subname'>$newName:";
                    echo "<div class='wow'>$materials</div>";
                    echo "</div><br>";
                }

            }
        }
    }
}

好吧,考虑到数据库笨拙的设计,您需要做的第一步是逐项列出诸如“教科书,文件夹,笔记本电脑”之类的列表(这样一来,每行只有三行,而不是三行)。 该操作的语义有点像SQL UNNEST,但可悲的是,数据库的“结构”(因使用该词而定,适合于您所拥有的)不适合使用该结构。 我不确定没有某种形式的过程编码就可以做到,因此最有可能正确的答案是“只是忘了在一个SQL语句中这样做”。

您所谓的DISTINCT 只能 在逐项列出之后 应用于 [获得的结果]。

应用DISTINCT之后,您需要重新分组。 也许可以用客户端语言来完成,但是那不是我要的。

一般而言,这不是一个非常可靠的数据库设计。 您可以更好地规范化表,并在每行中使用一个类名-书的组合。

如果这不是一个可能性,我会group_concat每类中的所有书籍,然后explode他们在PHP端阵列,使结果独特,并加入回一个字符串:

$sql = "SELECT classname, GROUP_CONCAT(book SEPARATOR ', ') AS materials FROM classes GROUP BY classname";
$result = mysqli_query($conn, $sql);

while ($row = mysqli_fetch_assoc($result)) {
    $classname = $row["classname"]; 
    $materials = $row["materials"];
    $materials = implode(',', array_unique(explode(', ', $materials)));
    echo "<div class='subname'>${classname}:";
    echo "<div class='wow'>$materials</div>";
    echo "</div><br/>";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM