В Mysql при использовании JOIN для 3 таблиц, получающих один и тот же вывод несколько раз в массиве

У меня есть 3 таблицы, одна с одной строкой для идентификатора, а две другие с несколькими строками для того же идентификатора.

Я написал запрос на присоединение к 3 таблицам

$id = $_GET['id'];

$joinSelect = "
    SELECT form_submitted.*,
    GROUP_CONCAT(form_submitted_news.news) as news,
    GROUP_CONCAT(form_submitted_language.language) as LANGUAGE
    FROM form_submitted 
    JOIN form_submitted_news ON form_submitted.id = form_submitted_news.cid
    JOIN form_submitted_language ON form_submitted.id = form_submitted_language.cid
    WHERE form_submitted.id='$id'
        AND form_submitted_language.cid='$id' 
        AND form_submitted_news.cid='$id' 
        GROUP BY form_submitted.id
";  

$result4 = mysqli_query($con,$joinSelect);

$update4 = mysqli_fetch_array($result4);

print_r($update4);

Но когда я печатаю массив, я получаю повторяющиеся значения в этих двух таблицах с несколькими строками -> form_submitted_news и form_submitted_language

Выход:

Array (
 [0] => 41 [id] => 41
 [1] => Ashok1 [name] => Ashok1 
 [2] => female [gender] => female 
 [3] => 2018-10-25 [dob] => 2018-10-25 
 [4] => [email protected] [email] => [email protected] 
 [5] => [password] => 
 [6] => Mech [dept] => Mech
 [7] => Sub1 [subject] => Sub1 
 [8] => address1 [address] => address1 
 [9] => logo_1540534309.png [image] => logo_1540534309.png
 [10] => 1 [status] => 1
 [11] => national,national,international,international,sports,sports 
   [news] => national,national,international,international,sports,sports 
 [12] => english,hindi,english,hindi,english,hindi 
   [LANGUAGE] => english,hindi,english,hindi,english,hindi 
)  

здесь массивы [11] и [12] получают повторяющиеся значения, то есть таблица с несколькими строками.

GROUP_CONCAT поддерживает DISTINCT option dev.mysql.com/doc/refman/8.0/en/… .. Кроме того, убедитесь, что вы установили group_concat_max_len перед использованием GROUP_CONCAT для больших групп или таблиц. (также в предоставленной мной ссылке на руководство)

Raymond Nijland 26.10.2018 15:22

Кроме того, SELECT form_submitted.*, .... GROUP BY form_submitted.id не является технически правильным ANSI SQL. MySQL допускает это, потому что он имеет расширенную "функцию" GROUP BY, когда сервер не работает в активном режиме sql ONLY_FULL_GROUP_BY .. Единственная проблема заключается в том, что неагрегированные столбцы выбора, которые не находятся в GROUP BY может получить недопустимые несвязанные данные (значения) для группы GROUP BY, если MySQL не мог использовать функциональную зависимость для получения правильных данных, которые поддерживают более современные версии MySQL. Я считаю, что это от MySQL версии 5.7 и выше

Raymond Nijland 26.10.2018 15:29

@RaymondNijland, все хорошо, но расширенная MySQL GROUP BY здесь не проблема

Arth 26.10.2018 15:49

"но расширенная MySQL GROUP BY здесь не проблема" MySQL расширенная функция GROUP BY "является корнем всех злобных неправильных данных в MySQL. @Arth, поэтому я упомянул это здесь ... О, и topicstarter, вы также должны прочитать, как предотвратить SQL-инъекции в PHP

Raymond Nijland 26.10.2018 15:51

@RaymondNijland Ну, это не корень всех злых неправильных данных, если это не причина неправильных данных здесь ... это просто плохая логика! Лично мне нравится эта функция, приятно иметь возможность группировать по всей записи, просто используя PK.

Arth 26.10.2018 15:56

«Мне нравится эта функция, приятно иметь возможность группировать по всей записи, просто используя PK». Да, я говорил о функциональной зависимости @Arth, кроме того, что он также работает с уникальным ключом, он не обязательно должен быть PK .. "Ну, это не корень всех злых неправильных данных, если это не причина неправильных данных здесь ... это просто плохая логика! " Трудно сказать, что без структуры таблицы вы предполагаете, что идентификатор автоматически означает PK, это тоже плохая логика. Мы даже не должны были комментировать это, не зная структуры (структур) таблицы

Raymond Nijland 26.10.2018 16:03

Первая строка вопроса в значительной степени говорит о том, что в этой таблице есть только одна строка для идентификатора ... так что это безопасное предположение в моих глазах. Если нет, приятель всегда может вернуться с дополнительной информацией.

Arth 26.10.2018 16:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
122
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Добро пожаловать!

Это связано с тем, как работает JOIN.

У вас есть 2 соответствующие языковые строки и 3 соответствующие записи новостей для идентификатора form_submitted, поэтому они дублируются

Перед применением GROUP BY ваш набор строк будет выглядеть следующим образом

id .   language .       news . 
41 .   national .       english
41 .   national .       hindi
41 .   international .  english
41 .   international .  hindi
41 .   sports .         english
41 .   sports .         hindi

Вы можете увидеть это, если удалите GROUP BY из своего запроса.

@RaymondNijland правильно в этой GROUP BY (DISTINCT ..) исправит это для вас

Лично я бы хотел сделать эти JOIN как бы отдельно, а не потом исправлять результат .. У меня возникло бы искушение запустить

   SELECT fs.*,
          fsn.news,
          fsl.language

     FROM form_submitted fs

     JOIN (
       SELECT cid,
              GROUP_CONCAT(news) news
         FROM form_submitted_news
        WHERE cid = '$id' /** not strictly necessary, but may improve performance */
     GROUP BY cid
          ) fsn
       ON fsn.cid = fs.id

     JOIN (
       SELECT cid,
              GROUP_CONCAT(language) language
         FROM form_submitted_language
        WHERE cid = '$id' /** not strictly necessary, but may improve performance */
     GROUP BY cid
          ) fsl
       ON fsl.cid = fs.id

    WHERE fs.id = '$id'

Хорошее объяснение того, почему результаты - это то, что получает автор темы «Лично я бы хотел делать эти JOIN как бы отдельно, а не исправлять результат позже» Да, переписывание предложения GROUP_CONCAT(DISTINCT...) для подхода к доставке таблиц (подзапросов) было бы более разумным с точки зрения производительности

Raymond Nijland 26.10.2018 15:54

Спасибо @Arth, но моя задача состояла в том, чтобы использовать один запрос SELECT для получения данных. Если я снова использую SELECT внутри JOIN, это похоже на использование нескольких SELECT. Итак, я использую GROUP_CONCAT (DISTINCT ...)

Vignesh balaji 29.10.2018 08:04

@VigneshBalaji Хм, не совсем, я считаю, что это все еще один запрос выбора и атомарный оператор с вложенными выборками ... но решать вам. Вы всегда можете сравнить варианты и посмотреть, какой из них быстрее.

Arth 29.10.2018 23:12

Другие вопросы по теме