簡體   English   中英

MySQL多表條件過濾器

[英]MySQL multiple tables conditional filter

我想從包含三種類型的用戶(類型icp )的用戶表中檢查user_id的有效性。

為了使c類型的用戶有效, customer_partner表中必須針對提供的$PNR提供當前user.party_id。

為了使類型為i用戶有效, installer_partner表中當前的user.party_id與提供的$PNR

為了使p類型的用戶有效,當前的user.party_id必須是提供的$PNR

我希望返回的行(如果有效)是用戶詳細信息,或者如果無效則不返回任何行。 我嘗試了幾種方法來執行此操作,但未成功。

示例1:我在select中使用CASE,然后在結果列中放置ve值,然后在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM