[英]MySQL multiple tables conditional filter
我想從包含三種類型的用戶(類型i
, c
和p
)的用戶表中檢查user_id
的有效性。
為了使c
類型的用戶有效, customer_partner
表中必須針對提供的$PNR
提供當前user.party_id。
為了使類型為i
用戶有效, installer_partner
表中當前的user.party_id與提供的$PNR
。
為了使p
類型的用戶有效,當前的user.party_id必須是提供的$PNR
。
我希望返回的行(如果有效)是用戶詳細信息,或者如果無效則不返回任何行。 我嘗試了幾種方法來執行此操作,但未成功。
示例1:我在select中使用CASE,然后在結果列中放置v
或e
值,然后在WHERE
語句中進行過濾,但這給了我Unknown column 'valid_user' in 'where clause'
錯誤中的Unknown column 'valid_user' in 'where clause'
。
SELECT
CASE users.party_type
WHEN 'c'
THEN IF(users.party_id IN (SELECT pnrcus.customer_id
FROM customer_partner AS pnrcus
WHERE pnrcus.partner_id = '.$PNR.'),'v','e')
WHEN 'i'
THEN IF(users.party_id IN (SELECT pnrins.installer_id
FROM installer_partner AS pnrins
WHERE pnrins.partner_id = '.$PNR.'),'v','e')
WHEN 'p'
THEN IF(users.party_id = '.$PNR.','v','e')
ELSE 'e'
END AS valid_user,
users.email_user_id,
users.party_id,
users.person_id,
users.first_name,
users.last_name
FROM users AS users
WHERE LCASE(users.email_user_id) = LCASE('.$UID.')
AND users.password = '.$PWD.'
AND valid_user = 'v'
AND users.account_status = 'a'
示例2:我在SQL的WHERE
部分中使用OR
語句。 這將返回錯誤的行。
SELECT
users.party_type
users.email_user_id,
users.party_id,
users.person_id,
users.first_name,
users.last_name
FROM users AS users
WHERE LCASE(users.email_user_id) = LCASE('.$UID.')
AND users.password = '.$PWD.'
AND users.account_status = 'a'
AND (
parties.party_type = 'c'
AND users.party_id IN (SELECT pnrcus.customer_id
FROM sma_customer_partner AS pnrcus
WHERE pnrcus.partner_id = .$PNR.')
) OR (
parties.party_type = 'i'
AND users.party_id IN (SELECT pnrins.installer_id
FROM sma_installer_partner AS pnrins
WHERE pnrins.partner_id = .$PNR.')
) OR (
parties.party_type = 'p'
AND users.party_id = '.$PNR.'
)
解決您的問題的快速方法是為您創建的結果集中的列添加HAVING
子句:
SELECT
CASE users.party_type
WHEN 'c'
THEN IF(users.party_id IN (SELECT pnrcus.customer_id
FROM customer_partner AS pnrcus
WHERE pnrcus.partner_id = '.$PNR.'),'v','e')
WHEN 'i'
THEN IF(users.party_id IN (SELECT pnrins.installer_id
FROM installer_partner AS pnrins
WHERE pnrins.partner_id = '.$PNR.'),'v','e')
WHEN 'p'
THEN IF(parties.party_id = '.$PNR.','v','e')
ELSE 'e'
END AS valid_user,
users.email_user_id,
users.party_id,
users.person_id,
users.first_name,
users.last_name
FROM users AS users
WHERE LCASE(users.email_user_id) = LCASE('.$UID.')
AND users.password = '.$PWD.'
AND users.account_status = 'a'
HAVING valid_user = 'v'
但是,坦率地說,我會這樣做:
SELECT
users.party_type
users.email_user_id,
users.party_id,
users.person_id,
users.first_name,
users.last_name
FROM users AS users
LEFT JOIN customer_partner AS pnrcus
ON pnrcus.partner_id = '.$PNR.'
AND pnrcus.customer_id = users.party_id
AND users.party_type = 'c'
LEFT JOIN installer_partner AS pnrins
ON pnrins.partner_id = '.$PNR.'
AND pnrins.installer_id = users.party_id
AND pnrins.party_type = 'i'
WHERE
LCASE(users.email_user_id) = LCASE('.$UID.')
AND users.password = '.$PWD.'
AND users.account_status = 'a'
AND (
( users.party_type ='p' AND users,party_id = '.$PNR.' )
OR pnrcus.partner_id IS NOT NULL
OR pnrins.partner_id IS NOT NULL
)
GROUP BY users.email_user_id;
注意順便說一句,這非常慢:
LCASE(users.email_user_id) = LCASE('.$UID.')
您可能想使用'A'='a'== true(所有_ci都為true)的排序規則,或者將其存儲為小寫並提供小寫形式。 就目前而言,它不能使用索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.