Как я могу условно объединить две таблицы MySQL на нескольких полях? - PullRequest
1 голос
/ 23 марта 2011

В моей БД MySQL у меня есть 2 таблицы: pos_tables и pos_user_loginpos_tables у меня есть четыре поля персонала: staff1, staff2, staff3, staff4.Эти 4 поля содержат идентификаторы сотрудников, хранящиеся в pos_user_loginpos_tables эти идентификаторы персонала могут повторяться, но staff_id является первичным ключом в pos_user_login.

Я пытаюсь объединить эти две таблицы, используя условие

if pos_user_login.staff_id=(pos_tables.staff1 OR
                            pos_tables.staff2 OR
                            pos_tables.staff3 OR
                            pos_tables.staff4)

... и если любое из 4 полей из pos_tables соответствует первичному ключу из pos_user_login, извлеките эту запись из pos_tables.

Какой запрос мне нужензапустить, чтобы сделать это?

---- РЕДАКТИРОВАТЬ ----

Должен ли я использовать что-то вроде этого?

SELECT *
    FROM pos_user_login pu
    WHERE pos_user_login_id IN (SELECT *
            FROM pos_tables
            WHERE staff1 = pu.pos_user_login_id
            OR staff2 = pu.pos_user_login_id
                                           ...);

---- РЕДАКТИРОВАТЬ 2 ----

SAMPLE RECORD

pos_tables
----------
table_number (1   )
staff1    (10)
staff2    (11)
staff3    (12)

pos_user_login
--------------
staff_id (10),
type (drinks_person)
staff_id(11), type (order_taker)
staff_id(12), type(cleaner)

После сравнения с использованием условия WHERE (type="drinks_person"), вывод должен быть:

table_number(1), staff1(10), staff2("null"), staff3(null)

Ответы [ 3 ]

4 голосов
/ 23 марта 2011

Вы можете использовать оператор IN():

SELECT *
FROM pos_tables JOIN pos_user_login 
  ON pos_user_login.staff_id IN (
    pos_tables.staff1,
    pos_tables.staff2,
    pos_tables.staff3,
    pos_tables.staff4
  ) 
1 голос
/ 23 марта 2011

Вот оно

select  a.*
from    pos_tables a left join
        pos_user_login b1 on a.staff1=b1.staff_id left join
        pos_user_login b2 on a.staff2=b2.staff_id left join
        pos_user_login b3 on a.staff3=b3.staff_id left join
        pos_user_login b4 on a.staff4=b4.staff_id
where  (b1.staff_id is not null or 
        b2.staff_id is not null or
        b3.staff_id is not null or
        b4.staff_id is not null)
1 голос
/ 23 марта 2011

Такие звуки, как будто данные хранятся не очень хорошо. Вы можете опубликовать схему?

Вот мое предложение: используя ifnull и делая несколько соединений, вы можете работать, если у одного из идентификаторов есть соединение. Я вернул «name», предполагая, что pos_user_login имеет это поле, но вы вернете любое поле, которое вам нужно.

SELECT 
     ifnull(p1.id,
        ifnull(p2.id,
           ifnull(p3.id,
              ifnull(p4.id,
                  'no matching record',
              p4.name,
           p3.name,
        p2.name,
     p1.name) as staff_name
FROM
     pos_tables t
      LEFT JOIN pos_user_login p1 on staff1=t.id
      LEFT JOIN pos_user_login p2 on staff2=t.id
      LEFT JOIN pos_user_login p3 on staff3=t.id
      LEFT JOIN pos_user_login p4 on staff4=t.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...