0

メンバーとそのステータス (uid、uname、uAddress、status) のリストを表示したい。T1 テーブルの uid が T2 テーブルのどこに存在するかを確認したい (T1.uid = T2.uid および tl_u_id='3') 存在する場合、ステータスは yes になり、そうでない場合は no になります。(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 からすべての行または大部分の行を返し、T1uidの uid 値と一致しない T2 の値が多くない場合、これははるかに効率的です。

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
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 に答える
1

これを行う簡単な方法を次に示します。最初のテーブルを選択し、レコードがテーブル 2 からのものである場合は 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 に答える