如何在多个字段上有条件地连接两个MySQL表?

时间:2011-03-23 01:34:43

标签: mysql sql join

在我的MySQL数据库中,我有两个表:pos_tablespos_user_login。在 pos_tables,我有四个职员字段:staff1staff2staff3staff4。这4个字段包含存储在其中的staffmembers的ID pos_user_login。在pos_tables中,这些员工ID可能会重复,但staff_idpos_user_login中的主键。

我要做的是使用

条件加入这两个表
if pos_user_login.staff_id=(pos_tables.staff1 OR
                            pos_tables.staff2 OR
                            pos_tables.staff3 OR
                            pos_tables.staff4)

...如果来自pos_tables的4个字段中的任何一个与主键相匹配 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 ----

示例记录

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 个答案:

答案 0 :(得分:4)

您可以使用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 :(得分:1)

声音的类似数据尚未很好地存储。你可以发布架构吗?

这是我的建议:使用ifnull并进行多个连接,如果其中一个id有连接,你可以解决。我已经返回“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

答案 2 :(得分:1)

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)