У меня есть следующие таблицы 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, но я действительно не знаю, с чего начать. Я был бы очень признателен за некоторые рекомендации.
Вам также не нужен echo для каждой строки PHP. echo $row['review_body'] . ' | ' . $row['review_body'] . '<br>';
@ user3783243 Спасибо. Не могли бы вы добавить в качестве ответа. Я пробовал один ответ, данный до сих пор, но, к сожалению, безуспешно :(
@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






вы вызываете две таблицы отдельно, вам нужно сделать внутреннее соединение между двумя
пример:
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";, но результат все тот же :( Не могли бы вы показать мне на моем примере выше, как реализовать?
Вы можете сделать это следующим образом:
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 для объединения данных из группы
Большое спасибо за вашу помощь здесь. Массивный :)
вы должны индексировать свой общий идентификатор в обеих таблицах и использовать внешние ключи для повышения производительности. этот подход основан на функции группового согласования.
если вы хотите 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,
О, пропустил, что вы не используете group by. Это неправильная реализация. Статическая 1 просто добавит путаницы.
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