MySQL:select语句中使用if-else的子查询

MySQL:select语句中使用if-else的子查询,mysql,sql,Mysql,Sql,我想显示成员列表及其状态uid、uname、uAddress、status。 我想检查T1表中的uid在T2表中的位置,即T1.uid=T2.uid和tl___id='3',如果存在,则状态为是,否则为否。tl___id列值应为 在查询中硬编码 Table T1 (Primary key: uid) Table T2 (primary_key: Aid) -------------------- ------------------

我想显示成员列表及其状态uid、uname、uAddress、status。 我想检查T1表中的uid在T2表中的位置,即T1.uid=T2.uid和tl___id='3',如果存在,则状态为是,否则为否。tl___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

请给我提供最好的方法。

这里有一个简单的方法。选择第一个表并连接第二个表,如果记录来自表2,则显示Yes作为状态else no

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'

下面是一个简单的方法。选择第一个表并连接第二个表,如果记录来自表2,则显示Yes作为状态else no

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 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
但这不一定是获取resultset的最佳方法,因为MySQL处理外部查询中每一行的子查询的方式对于大型集合来说可能非常昂贵,所以对于小型集合以外的任何集合来说,这都不一定是获取resultset的最佳方法

另一种方法是,如果返回T1中的所有行或大部分行,并且T2中没有很多uid值与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
如果您保证T2uid、tl\u\u id是唯一的,或者至少对于tl\u\u id='3'的给定uid不会有任何重复项,那么您可以通过消除内联视图来获得更好的性能


为了获得最佳性能,您可能需要一个索引。。。在T2 tl____id,uid.

上,有几种方法可以获得结果集

如果要返回一小部分行,那么使用相关子查询可以很快

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
但这不一定是获取resultset的最佳方法,因为MySQL处理外部查询中每一行的子查询的方式对于大型集合来说可能非常昂贵,所以对于小型集合以外的任何集合来说,这都不一定是获取resultset的最佳方法

另一种方法是,如果返回T1中的所有行或大部分行,并且T2中没有很多uid值与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
如果您保证T2uid、tl\u\u id是唯一的,或者至少对于tl\u\u id='3'的给定uid不会有任何重复项,那么您可以通过消除内联视图来获得更好的性能


为了获得最佳性能,您可能需要一个索引。。。在T2 tl___\u id,uid上。

如果uid,tl_\u id在T2中不保证唯一,则可能返回重复项。如果uid,tl_\u id在T2中不保证唯一,则可能返回重复项。+1。注意,谓词tl__id='3'可以在别名为b.+1的内联视图中移动。注意,谓词tl___id='3'可以在别名为b的内联视图中移动。在表T2中,t1__id不是唯一的。在表T2中,t1__id不是唯一的