Проблемы с сортировкой при соединении MySQL

#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 ресторанами.