У меня есть 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] получают повторяющиеся значения, то есть таблица с несколькими строками.
Кроме того, 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 и выше
@RaymondNijland, все хорошо, но расширенная MySQL GROUP BY здесь не проблема
"но расширенная MySQL GROUP BY здесь не проблема" MySQL расширенная функция GROUP BY "является корнем всех злобных неправильных данных в MySQL. @Arth, поэтому я упомянул это здесь ... О, и topicstarter, вы также должны прочитать, как предотвратить SQL-инъекции в PHP
@RaymondNijland Ну, это не корень всех злых неправильных данных, если это не причина неправильных данных здесь ... это просто плохая логика! Лично мне нравится эта функция, приятно иметь возможность группировать по всей записи, просто используя PK.
«Мне нравится эта функция, приятно иметь возможность группировать по всей записи, просто используя PK». Да, я говорил о функциональной зависимости @Arth, кроме того, что он также работает с уникальным ключом, он не обязательно должен быть PK .. "Ну, это не корень всех злых неправильных данных, если это не причина неправильных данных здесь ... это просто плохая логика! " Трудно сказать, что без структуры таблицы вы предполагаете, что идентификатор автоматически означает PK, это тоже плохая логика. Мы даже не должны были комментировать это, не зная структуры (структур) таблицы
Первая строка вопроса в значительной степени говорит о том, что в этой таблице есть только одна строка для идентификатора ... так что это безопасное предположение в моих глазах. Если нет, приятель всегда может вернуться с дополнительной информацией.






Добро пожаловать!
Это связано с тем, как работает 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...) для подхода к доставке таблиц (подзапросов) было бы более разумным с точки зрения производительности
Спасибо @Arth, но моя задача состояла в том, чтобы использовать один запрос SELECT для получения данных. Если я снова использую SELECT внутри JOIN, это похоже на использование нескольких SELECT. Итак, я использую GROUP_CONCAT (DISTINCT ...)
@VigneshBalaji Хм, не совсем, я считаю, что это все еще один запрос выбора и атомарный оператор с вложенными выборками ... но решать вам. Вы всегда можете сравнить варианты и посмотреть, какой из них быстрее.
GROUP_CONCAT поддерживает DISTINCT option dev.mysql.com/doc/refman/8.0/en/… .. Кроме того, убедитесь, что вы установили group_concat_max_len перед использованием GROUP_CONCAT для больших групп или таблиц. (также в предоставленной мной ссылке на руководство)