簡體   English   中英

MySQL:在select語句中使用if else進行子查詢

[英]MySQL: Subquery in the select statement using if else

我想顯示成員及其狀態的列表(uid,uname,uAddress和status)。 我想檢查T1表中的uid在T2表中是否存在,即(T1.uid = T2.uid和tl_u_id ='3')如果存在,則狀態為是,否則為否。 (tl_u_id列值應在查詢中進行硬編碼)

 Table T1 (Primary key: uid)                  Table T2 (primary_key: Aid)

        --------------------      ---------------------------
        uid   uname  uAddress      uid  Aid  tl_u_id  ename
        --------------------      ---------------------------
         1      aa     ch           2    1    3        TG
         2      bb     LA           4    2    3        IS
         3      cc     NY           2    3    4        DS
         4      dd     DC
        --------------------      --------------------------

Result for tl_u_id=3
-------------------------
uid uname uAddress status
-------------------------
1    aa      ch      No
2    bb      LA      Yes
3    cc      NY      No
4    dd      DC      yes

請提供給我最好的方法。

有幾種獲取結果集的方法。

如果要重現少量行,則使用關聯子查詢可能會很快。

SELECT u.uid
     , u.uname
     , u.uAddress
     , IFNULL(
         (SELECT 'Yes'
            FROM T2 s 
           WHERE s.uid = t.uid
             AND s.tl_u_id = '3'
           LIMIT 1
         )
       ),'No') AS status
  FROM T1 u

但這不一定是獲取結果集的最佳方法,除了小集合(由於MySQL處理外部查詢中每一行的子查詢的方式)以外,對於大集合而言,這可能是昂貴的。

另一種方式,如果你正在返回所有或大比例的,從T1行,並且不會有很多值的uid在T2不匹配T1一個UID值,這樣可以更有效:

SELECT u.uid
     , u.uname
     , u.uAddress
     , IF(s.uid IS NOT NULL,'Yes','No') AS status
  FROM T1 u
  LEFT
  JOIN (SELECT r.uid
          FROM T2 r
         WHERE r.tl_u_id = '3'
         GROUP BY r.uid
       ) s
    ON s.uid = u.uid

如果您保證T2(uid,tl_u_id)是唯一的,或者至少對於tl_u_id='3'的給定uid不存在任何重復項,則可以通過消除內聯視圖來獲得更好的性能。

為了獲得最佳性能,您可能需要索引... ON T2 (tl_u_id, uid)

這是一種簡單的方法。 選擇第一個表,如果記錄來自表2,則加入第二個表,將顯示為狀態,否則為否。

SELECT
    T1.uid,
    T1.uname,
    T1.uAddress
    IF(T2.uid IS NULL ,'No','Yes') as `Status`
FROM    T1
LEFT JOIN T2 ON T1.uid = T2.uid 
AND T2.tl_u_id='3'
SELECT  a.*,
        CASE 
            WHEN b.uid  IS NULL 
            THEN 'NO' 
            ELSE 'YES' 
        END Status
FROM    tableT1 a
        LEFT JOIN
        (
            SELECT  DISTINCT uid, tl_u_id  -- <<== filter duplicates
            FROM    tableT2
        ) b ON  a.uid = b.uid AND
                b.tl_u_id = 3

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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