COnditional JOIN запрос в MySQL - PullRequest
       1

COnditional JOIN запрос в MySQL

0 голосов
/ 20 сентября 2019

У меня есть две таблицы mysql

user:

|--------------------------------|
| id | name  | type | ruser_type |
|--------------------------------|
|  1 | Admin | a    |            |
|  2 |       | r    |      c     |
|--------------------------------|

customer

|-------------------------|
|  id  |  name  | user_id | 
|-------------------------|
|  1   |  Sam   |    2    |
|-------------------------|

Если user.type является 'a' или 's', то егопользователь с правами администратора, имя которого находится в таблице пользователей.

Если user.type - это «r», а ruser_type - «c», то это обычный пользователь, имеющий отношение в таблице клиентов, где customer.user_id = user.id

Я хочу запрос, который запускает условное соединение.Если user.type это 'a' или 's', то имя будет выбрано из пользовательской таблицы.

Если user.type это 'r' и ruser_type это 'c', тогда имя будетизвлекается из таблицы клиентов с условием JOIN customer.user_id = user.id.

. Для этого я написал такой запрос: -

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?

Ответы [ 3 ]

0 голосов
/ 20 сентября 2019

Я написал два 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    type
Sam     r
Admin   a

Ссылка на файл БД https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=b02d931b68a4f70d8b4a84144c60a572

0 голосов
/ 20 сентября 2019

Это даст вам требуемый результат для всех пользователей:

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)

Добавьте необходимое условие.

Вы можете даже упростить его, чтобы получить общий столбец 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)
0 голосов
/ 20 сентября 2019

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'))
       )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...