все! У меня есть немного хитрый для вас сегодня, я хочу использовать оператор 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>";
}
}
}
}
}
Как правило, это не очень надежный дизайн базы данных. Возможно, вам лучше будет нормализовать вашу таблицу и иметь в каждой строке по одной комбинации "имя-класс".
Если это невозможно, я бы 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/>";
}
Что ж, учитывая дрянной дизайн вашей базы данных, первый шаг, который вам нужно сделать, - это разбить список по спискам, например "учебник, папка, ноутбук" [таким образом, что вы получите три строки с одним элементом вместо одной строки с тремя элементами]. Семантика этой операции немного похожа на SQL UNNEST, но, к сожалению, "структура" (поскольку использование этого слова подходит для того, что у вас есть) вашей базы данных не подходит для ее использования. Я не уверен, что это можно сделать без какой-либо формы процедурного кодирования, поэтому наиболее вероятным ответом будет "просто забудь сделать это в одном операторе SQL".
То, что вы называете DISTINCT, может применяться только к полученным результатам после детализации.
После применения DISTINCT вам необходимо повторно сгруппировать. Может быть, это можно сделать на клиентском языке, но это не моя чашка чая.
English: textbook, folder, laptop
иEnglish: textbook
не различим. Что вы ожидаете, когда строки являютсяEnglish: textbook, audio CD
иEnglish: textbook, folder, laptop
?