MySQL中的条件连接查询

MySQL中的条件连接查询,mysql,laravel-5.7,Mysql,Laravel 5.7,我有两张mysql表 用户: 顾客 |-------------------------| | id | name | user_id | |-------------------------| | 1 | Sam | 2 | |-------------------------| 如果user.type是'a'或's',则其名称位于用户表中的管理员用户 如果user.type是'r'并且ruser\u type是'c',那么它的常规用户在customer表中

我有两张mysql表

用户:

顾客

|-------------------------|
|  id  |  name  | user_id | 
|-------------------------|
|  1   |  Sam   |    2    |
|-------------------------|
如果
user.type
是'a'或's',则其名称位于用户表中的管理员用户

如果
user.type
是'r'并且
ruser\u type
是'c',那么它的常规用户在customer表中有一个关系,其中
customer.user\u id=user.id

我想要一个运行条件联接的查询。 如果
user.type
是'a'或's',则将从用户表中提取名称

如果
user.type
是'r'并且
ruser\u type
是'c',那么将使用连接条件
customer.user\u id=user.id
从customer表中获取名称

为此,我编写了如下查询:-

SELECT users.fname as adminFname, customers.fname as customerFname, users.type FROM users
LEFT JOIN customers ON (customers.user_id = users.id AND 
                            ( 
                                (users.type = 'r' AND users.ruser_type = 'c') 
                                    OR users.type = 'a' 
                                    OR users.type = 's'
                            )
                       )
                        WHERE users.id = 1
是否有可能进一步优化查询


另外,我如何使用Laravel eloquent编写此查询?

FWIW,我发现这稍微更容易阅读

SELECT u.fname adminFname
     , c.fname customerFname
     , u.type 
  FROM users u
  LEFT 
  JOIN customers c
    ON c.user_id = u.id 
 WHERE u.id = 1
   AND (
        (u.type = 'r' AND u.ruser_type = 'c')
     OR (u.type IN('a','s'))
       )

我已经写了两个sql查询,希望对您有所帮助

SELECT CASE CU.type WHEN 'a' OR 's' THEN CU.name END AS name,
CASE WHEN CU.type = 'r' AND CU.ruser_type = 'c' THEN CR.name END AS cust_name, CU.type
FROM 
user AS CU
LEFT JOIN customer AS CR ON CR.user_id = CU.id
这样你会得到这样的结果

name    cust_name   type
          Sam         r
Admin                 a
SELECT CASE WHEN CU.type  = 'a' OR 's' THEN CU.name ELSE CR.name END AS name, CU.type
FROM 
user AS CU
LEFT JOIN customer AS CR ON CR.user_id = CU.id
我写了另一个这样的问题

name    cust_name   type
          Sam         r
Admin                 a
SELECT CASE WHEN CU.type  = 'a' OR 's' THEN CU.name ELSE CR.name END AS name, CU.type
FROM 
user AS CU
LEFT JOIN customer AS CR ON CR.user_id = CU.id
在这里你会得到这样的结果

name    type
Sam     r
Admin   a
数据库文件链接
这将为所有用户提供所需的结果:

SELECT u.fname adminFname
     , c.fname customerFname
     , u.type 
  FROM users u
  LEFT JOIN customers c
    ON (u.type = 'r' AND u.ruser_type = 'c' AND c.user_id = u.id)
根据需要添加where条件

您甚至可以进一步简化它,以在输出中获得通用的firstName列:

SELECT COALESCE(u.fname, c.fname) firstName, u.type 
  FROM users u
  LEFT JOIN customers c
    ON (u.type = 'r' AND u.ruser_type = 'c' AND c.user_id = u.id)

懒散的方法是
联合
两个查询的结果。一个用于管理员,一个用于客户。在那里可以找到另一个解决方案:除了为所有相关表显示CREATE TABLE语句外,有关查询优化的问题始终需要对给定查询进行解释。您可以在两个查询中使用带id的where条件来获得id相关的结果。