MySQL Запрос, чтобы получить имена и контактные данные лиц из DINERS по указанному c DINING_TABLE - PullRequest
0 голосов
/ 06 мая 2020

У меня есть сценарий, когда разные повара предлагают свои dining_tables за booking (максимум четыре человека за одним столом). Разные посетители проверяют, есть ли место у любого шеф-повара.

У меня есть три разные таблицы, такие, что:

  • basic_profile содержит данные всех пользователей (имя, контакт, age et c)
  • register_diner содержит детали обеденного стола (предложено_би (шеф-повар), стул_1 ... стул_4, ...)

Когда посетитель проверяет что стул доступен для шеф-повара dining_table, он нажимает кнопку книги, и его адрес электронной почты сохраняется под chair_1/2/3/4, который он выберет.

теперь, чтобы шеф-повар мог видеть тех, кто зарегистрировался у него, он может запрашивать, например,

select * from register_diner where offered_by = 'ME'.

Он / она получает такие результаты, как

offered_by, chair_1, chair_2, chair_3, chair_4 ....  
ME,         a@b.com  x@y.com   i@j.com  b@c.com

Теперь я хочу запустить запрос, который может показать мне имя и контакт человека из basic_profile , наберите chair 1/2/3/4 вместо электронной почты. Для других таблиц я использовал вложенные запросы, но здесь у меня есть четыре ключевых слова, и я сделал все, что мог за последние три дня, чтобы достичь этого.

Пожалуйста, нужна помощь.

1 Ответ

1 голос
/ 07 мая 2020

В идеале ваше приложение должно вводить идентификаторы, а не электронные письма, в register_diner для каждого из четырех стульев. Но чтобы вернуть соответствующее имя и контакт, рассмотрите возможность нескольких самостоятельных присоединений к таблице поиска basic_profile. Ниже предполагается, что есть поле email в basic_profile:

select r.offered_by
       , p1.name as chair1_name, p1.contact as chair1_contact
       , p2.name as chair2_name, p2.contact as chair2_contact
       , p3.name as chair3_name, p3.contact as chair3_contact
       , p4.name as chair4_name, p4.contact as chair4_contact
from register_diner r
inner join basic_profile p1
   on r.chair1 = p1.email
inner join basic_profile p2
   on r.chair2 = p2.email
inner join basic_profile p3
   on r.chair3 = p3.email
inner join basic_profile p4
   on r.chair4 = p4.email
where r.offered_by = 'ME'

Но опять же, в идеале вы присоединяетесь по идентификаторам, которые были бы намного эффективнее, чем потенциально длинные поля text или varchar:

inner join basic_profile p1
   on r.chair1_profile_id = p1.id
...

На самом деле, передовой опыт проектирования баз данных предполагает, что вам следует нормализовать таблицу от широкого до длинного формата, так как в будущем вы можете увеличить большие таблицы до 5 или 6. Это менее затратно и более управляемо. добавлять строки, чем столбцы. Тогда вам просто понадобится один join для таблицы поиска с новым столбцом для номера стула.

select r.offered_by
       , r.chair_number
       , p.name as chair_name
       , p.contact as chair_contact
from register_diner r
inner join basic_profile p
   on r.profile_id = p.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...