0

我想显示成员列表及其状态(uid、uname、uAddress、状态)。我想检查 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

请给我最好的方法来做到这一点。

4

3 回答 3

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

但这不一定是获取结果集的最佳方式,除了小集合(由于 MySQL 处理该子查询的方式,对于外部查询中的每一行),这对于大集合来说可能是昂贵的。

另一种方式,如果您要返回 T1 中的所有行或大部分行,并且uidT2 中没有很多与 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),或者至少对于给定的 uid 不会有任何重复tl_u_id='3',那么您可以通过消除内联视图来获得更好的性能。

为了获得最佳性能,您可能需要一个索引 ... ON T2 (tl_u_id, uid)

于 2013-01-30T06:45:12.760 回答
1

这是一个简单的方法。如果记录来自表 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'
于 2013-01-30T06:34:54.980 回答
1
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
于 2013-01-30T06:41:35.880 回答