Объединить результат MySQL (присоединиться?)

У меня есть следующие таблицы MySQL:

CREATE TABLE `person` (
  `id` int NOT NULL AUTO_INCREMENT,
  `reference` varchar(100) NOT NULL,
  `email` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

INSERT INTO `person` (`id`, `reference`, `email`) VALUES
(1, 'PK001',    '[email protected]');

CREATE TABLE `review` (
  `id` int NOT NULL AUTO_INCREMENT,
  `review_type` varchar(255) NOT NULL,
  `review_body` varchar(255) NOT NULL,
  `person_id` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

INSERT INTO `review` (`id`, `review_type`, `review_body`, `person_id`) VALUES
(1, 'Personality',  'He has a great personality!',  1),
(2, 'Skills',   'He has multiple skills!',  1);

Если я запускаю следующий PHP:

$sql = "SELECT * FROM person, review WHERE person.id = review.person_id;";
$result = $con->query($sql);

while($row = $result->fetch_assoc())  {
    echo $row['review_body'];
    echo ' | ';
    echo $row['review_body'];
    echo '<br>';
}

Мой вывод:

He has multiple skills! | He has multiple skills!
He has a great personality! | He has a great personality!

Я бы предпочел, чтобы это было так:

He has multiple skills! | He has a great personality!

Я предполагаю, что мне придется пререкаться с моим запросом MySQL, но я действительно не знаю, с чего начать. Я был бы очень признателен за некоторые рекомендации.

FROM person, review WHERE person.id = review.person_id — это не то, как join следует писать в 2023 году. FROM person as p join review as r on p.id = r.person_id
user3783243 02.02.2023 18:07

Вам также не нужен echo для каждой строки PHP. echo $row['review_body'] . ' | ' . $row['review_body'] . '<br>';

user3783243 02.02.2023 18:08

@ user3783243 Спасибо. Не могли бы вы добавить в качестве ответа. Я пробовал один ответ, данный до сих пор, но, к сожалению, безуспешно :(

michaelmcgurk 02.02.2023 18:13

@Stu Я изучаю это, но спотыкаюсь в темноте. Пробуем с SELECT person.id, GROUP_CONCAT(review.review_body SEPARATOR ' ') FROM person INNER JOIN review ON person.id = review.person_id GROUP BY person.id

michaelmcgurk 02.02.2023 18:17
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
2
4
82
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

вы вызываете две таблицы отдельно, вам нужно сделать внутреннее соединение между двумя

пример:

SELECT column_name(s)
FROM table1
INNER JOIN table2
ON table1.column_name = table2.column_name;

или

смотрите эту ссылку

Большое спасибо. Я обновил свой SQL до: $sql = "SELECT review_body FROM person INNER JOIN review ON person.id = review.person_id";, но результат все тот же :( Не могли бы вы показать мне на моем примере выше, как реализовать?

michaelmcgurk 02.02.2023 18:12
Ответ принят как подходящий

Вы можете сделать это следующим образом:

SELECT p.id, group_concat(r.review_body)
FROM person p
inner join review r on r.person_id = p.id
group by p.id

Использование group_concat для объединения данных из группы

Демо здесь

Большое спасибо за вашу помощь здесь. Массивный :)

michaelmcgurk 03.02.2023 09:07

вы должны индексировать свой общий идентификатор в обеих таблицах и использовать внешние ключи для повышения производительности. этот подход основан на функции группового согласования.

если вы хотите 1 строку для всех результатов.

SELECT 1,GROUP_CONCAT( review_body SEPARATOR ' | ') as goruped_result 
FROM person
INNER JOIN review
ON review.person_id = person.id;

если вы хотите 1 строку на человека.id

SELECT person.id,GROUP_CONCAT( review_body SEPARATOR ' | ') as   
goruped_result 
FROM person
INNER JOIN review
ON review.person_id = person.id
group by person.id

Зачем нужен 1? SELECT 1,

user3783243 02.02.2023 20:02

О, пропустил, что вы не используете group by. Это неправильная реализация. Статическая 1 просто добавит путаницы.

user3783243 02.02.2023 21:52

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