Как использовать строку DISTINCT и строку не DISTINCT

0

все! У меня есть немного хитрый для вас сегодня, я хочу использовать оператор select DISTINCT, чтобы выбрать строку, которая должна быть отличной, но также и в том же операторе (или как я пытался?) Строку, которая не не может быть отличным. Мой желаемый результат - иметь только одно из каждого имени класса. В настоящее время это выводит так:

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>";
                }

            }
        }
    }
}
  • 0
    Непонятно, о чем вы спрашиваете. Пожалуйста, перефразируйте ваш вопрос, показав нам четкие примерные данные входной таблицы, а также точный ожидаемый результат и ваше лучшее описание того, что там происходит. Из того, что я вижу, код PHP может даже не иметь здесь никакого отношения, если предположить, что SQL сам по себе может выполнять ту работу, которую вы хотите.
  • 0
    English: textbook, folder, laptop и English: textbook не различим. Что вы ожидаете, когда строки являются English: textbook, audio CD и English: textbook, folder, laptop ?
Показать ещё 8 комментариев
Теги:

2 ответа

1

Как правило, это не очень надежный дизайн базы данных. Возможно, вам лучше будет нормализовать вашу таблицу и иметь в каждой строке по одной комбинации "имя-класс".

Если это невозможно, я бы 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/>";
}
1

Что ж, учитывая дрянной дизайн вашей базы данных, первый шаг, который вам нужно сделать, - это разбить список по спискам, например "учебник, папка, ноутбук" [таким образом, что вы получите три строки с одним элементом вместо одной строки с тремя элементами]. Семантика этой операции немного похожа на SQL UNNEST, но, к сожалению, "структура" (поскольку использование этого слова подходит для того, что у вас есть) вашей базы данных не подходит для ее использования. Я не уверен, что это можно сделать без какой-либо формы процедурного кодирования, поэтому наиболее вероятным ответом будет "просто забудь сделать это в одном операторе SQL".

То, что вы называете DISTINCT, может применяться только к полученным результатам после детализации.

После применения DISTINCT вам необходимо повторно сгруппировать. Может быть, это можно сделать на клиентском языке, но это не моя чашка чая.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню