我想显示成员列表及其状态(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
请为我提供最好的方法。
答案 0 :(得分: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处理子查询的方式,对于外部查询中的每一行),对于大集合来说这可能是昂贵的。 / p>
另一种方法是,如果要返回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
如果您保证T2(uid,tl_u_id)
是唯一的,或者至少对于tl_u_id='3'
的给定uid不会有任何重复,那么您可以通过消除内联视图来获得更好的性能。< / p>
为获得最佳效果,您可能需要索引... ON T2 (tl_u_id, uid)
。
答案 1 :(得分: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'
答案 2 :(得分: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