web-dev-qa-db-ja.com

MySQL結合とIF条件

次のようなクエリで結果を取得したい:

SELECT 
    * FROM
    users LEFT JOIN
    IF (users.type = '1', 'private','company') AS details ON
    users.id = details.user_id WHERE
    users.id = 1

何か案は?

19
plugowski
SELECT * FROM users 
LEFT JOIN private AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type = 1

UNION

SELECT * FROM users 
LEFT JOIN company AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type != 1

それが君のやろうとしていることだと思いませんか?

これで列の数が異なると述べたので、列を指定する必要があります。

SELECT 'private' AS detailType, users.*, col1, col2, col3, '' FROM users 
LEFT JOIN private AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type = 1

UNION

SELECT 'company', users.*, col1, '', '', col4  FROM users 
LEFT JOIN company AS details ON users.id = details.user_id 
WHERE users.id = 1 AND users.type != 1

この例では、privateには列col1、col2およびcol3があり、companyにはcol1およびcol4がありますが、すべて必要です。

24
Cez

これはすでに解決されていると思いますが、同様の問題を抱えている人にとっては。

複数の左結合を試行してすべてのデータを取得することもできます

SELECT *, IF (users.type = 1, p.name, c.name) AS name FROM users
LEFT JOIN private AS p ON (users.type = 1 AND users.id = p.user_id) 
LEFT JOIN company AS c ON (users.type != 1 AND users.id = c.user_id)
20
SELECT
  users.*,
  details.info,
  CASE users.type WHEN '1' THEN 'private' ELSE 'company' END AS user_type
FROM
  users
  INNER JOIN (
    SELECT user_id, info FROM private
    UNION
    SELECT user_id, info FROM company
  ) AS details ON details.user_id = users.id

編集:回答の元のバージョン(誤解された質問):

SELECT
  *, 
  CASE type WHEN '1' THEN 'private' ELSE 'company' END AS details
FROM
  users
WHERE
  users.id = 1
6
Tomalak

ここでは、Magento2 SQLクエリのif else条件を共有して、顧客がログインしていて両方がログインしていないレポート注文詳細を取得しています。状況に応じてクエリを拡張しました。

SELECT 
    so.increment_id as ID,
    sog.customer_id as Customer_Id,
    sog.customer_name as Customer_Name,
    sog.customer_email as Customer_Email,
    CASE sog.customer_group 
        WHEN '1' THEN 'Custome Login'
        ELSE 'Not Login'
    END as Customer_Group,
    sog.grand_total as Grand_Total,
    sog.subtotal as Subtotal,
    sog.billing_name as Billing_Name,
    sog.billing_address as Billing_Address,
    sog.shipping_address as shipping_address,
    so.shipping_description as Shipping_Information,
    so.status as Status,
    so.cancel_order_username as Canceled_BY,
    so.cancel_order_currenttime as Cancellation_Time,
    so.cancel_order_comment as Cancellation_Reason
FROM sales_order so
LEFT JOIN sales_order_grid as sog ON sog.increment_id=so.increment_id
WHERE so.cancel_order_currenttime >= Date('2018-10-01')
    AND so.cancel_order_currenttime <= Date('2018-12-05')

ここでは、状況に応じてエイリアスを作成しました:so->sales_order table, sog->sales_order_grid,

顧客グループにはif/else条件を使用しています。これは、ゲストユーザーには"0"が使用され、ログインユーザーには"1"が使用され、両方が顧客グループに使用されるためです。

この提案があなたの混乱を助けてくれることを願っています。この答えを理解する上で何か問題に直面した場合はお知らせください。