#php #mysql
#php #mysql
Вопрос:
Вот уже несколько дней я не могу найти решение для этой единственной проблемы, касающейся сортировки данных из объединенной таблицы.
Допустим, я составляю маршруты по ресторанам для пользователей. У каждого пользователя есть несколько ресторанов в его маршруте.
У меня есть две таблицы, одна из которых содержит информацию о маршруте пользователя (когда он будет посещать рестораны, какие рестораны), а другая содержит информацию обо всех ресторанах, которые я знаю.
руководства ………………. и………….. рестораны
userid ---> id
restaurant1_id -->--| name
date1 | style
restaurant2_id -->--| address
date2
«restaurant1_id» или «restaurant2_id» соответствует «id» в таблице restaurants. Итак, я выполняю внутреннее объединение этих таблиц следующим образом:
SELECT restaurants.name AS name, restaurants.style AS style, restaurants.address AS address, guides.date1 AS date1, guides.date2 AS date2
FROM `guides`
INNER JOIN `restaurants`
ON guides.restaurant1_id = restaurants.id or guides.restaurant2_id = restaurants.id
WHERE guides.userid = 2
Допустим, я хотел бы увидеть всю информацию обо всех ресторанах, которые посетит пользователь с идентификатором «2». С помощью следующего запроса я получаю желаемый результат:
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo
$row['name'].'<br>'
.$row['style'].'<br>'
.$row['address'].'<hr>' ;
}
}
else {
echo 'No results.';
}
Я создал скрипку здесь.
Где у меня возникают проблемы, так это с сортировкой результатов. Я бы хотел, чтобы ресторан, который упоминается в таблице «guides» как «restaurant1_id», отображался перед «restaurant2_id».
Другой проблемой является дата. Я не могу понять, как показать ‘date1’ рядом с названием ‘restaurant1_id’.
Должен ли я хранить все данные в переменных или есть лучший способ подойти к этому? Я ценю любые предложения!
Комментарии:
1. Похоже, большая проблема заключается в том, что вы получите несколько строк, возвращенных обратно. Я подозреваю, что вы хотите присоединиться к таблице restaurants несколько раз, по одному разу для каждого ресторана.
2. Спасибо за ваше предложение для начала. Однако Garden Apple нашла решение для этой проблемы.
Ответ №1:
Попробуйте запрос
SELECT IF(guides.restaurant1_id = restaurants.id, 1, 0) as srt ,
restaurants.name AS name, restaurants.style AS style,
restaurants.address AS address, guides.date1 AS date1, guides.date2 AS date2
FROM `guides`
INNER JOIN `restaurants` ON guides.restaurant1_id = restaurants.id or guides.restaurant2_id = restaurants.id
WHERE guides.userid = 2
order by srt DESC
Показать результаты:
$result = $conn->query($sql);
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo
$row['name'].'<br>'
.($row['srt']?$row['date1']:$row['date2']).'<br>'
.$row['style'].'<br>'
.$row['address'].'<hr>' ;
}
}
else {
echo 'No results.';
}
Комментарии:
1. Это работает отлично. Большое спасибо. И я смог изменить его, чтобы заставить его работать более чем с 2 ресторанами.