Member 13933133 Ответов: 1

Повторение данных из базы данных?


Привет, я хотел бы рассказать вам о проблеме, которую я должен увидеть, если кто-то может мне помочь.
Я создал таблицу в базе данных со следующими столбцами:

Таблица: Союз
exercise_id_fk	tag_id_fk
   1	             1
   1	             2
   2	             1
   2	             3
В своей программе я делаю вид, что пользователь выбирает нужные ему теги, чтобы на экране отображалось упражнение, соответствующее выбранным тегам. Например, если пользователь выберет тег 1, появятся упражнения 1 и 2. Если вы выберете теги 1 и 3, появятся упражнения 1 и 2.

Проблема с моей программой заключается в том, что когда пользователь выбирает теги 1 и 3, например, упражнения 1 и 2 появляются, но 2 повторяются. Или когда вы выбираете метки 1 и 2, Упражнение 1 повторяется.

Кто-нибудь знает какой-нибудь способ, чтобы этого не случилось? Показывать упражнения только один раз?

Что я уже пробовал:

Здесь я показываю часть своего кода:
$sql = "SELECT * FROM exercises, union, tags where exercise_id = exercise_id_fk and tag_id = tag_id_fk";

if (!empty($_SESSION['tags_array'])) {
    $sql .= " and (";
    foreach ($_SESSION['tags_array'] as $tagId)
        $sql .= 'tag_id = ' . $tagId . ' or ';

    $sql .= "tag_id = -1);";
}

$result = $conn->query($sql);
while($row = $result->fetch_assoc()) {
    echo $row["exercise_id"] . ". " .  $row["title"] . "<br>";
}

1 Ответов

Рейтинг:
4

Jochen Arndt

То что вы ищете это SQL DISTINCT ключевое слово, которое возвращает только различные значения.

Кроме того, ваша SQL-команда слишком сложна (содержит избыточную информацию). Насколько я понимаю, вы хотите запросить единую таблицу "union" для одного поля. Тогда общий синтаксис может быть следующим

SELECT DISTINCT exercise_id_fk FROM union WHERE tag_id_fk IN (<list_of_tags>)
Вышеизложенное также использует SQL IN ключевое слово для сопоставления значений из списка.

Непроверенный пример с нуля:
$tags_array = $_SESSION['tags_array'];
$tags = count($tags_array);
$sql = "SELECT DISTINCT exercise_id_fk FROM 'union' WHERE tag_id_fk"; 
if ($tags == 1) {
    $sql .= "=" . $tags_array[0]; 
}
else {
    $sql .= " IN (" . $tags_array[0];
    for ($i = 1; $i < $tags; $i++) {
        $sql .= ", " . $tags_array[$i];
    }
    $sql .= ")"
}
Обратите внимание, что я процитировал имя таблицы "union", потому что это зарезервированное слово SQL.


Member 13933133

Большое спасибо! :Д