繁体   English   中英

在 MySQL 中使用 UNION ALL 的子查询

[英]Subquery using UNION ALL in MySQL

我想我不明白子查询的工作顺序。

当我运行此 SQL 语句时,我得到 1 个(表中存在的 3 个)随机“朋友 ID”:

SELECT t1.sender_id AS Connections FROM
                (SELECT DISTINCT sender_id
                FROM connection
                WHERE receiver_id = 'my_id'
                AND status = 'Approved') t1
                UNION ALL                 
SELECT t2.receiver_id FROM
                (SELECT DISTINCT receiver_id
                FROM connection
                WHERE sender_id = 'my_id'
                AND status = 'Approved') t2
ORDER BY RAND() LIMIT 1;

返回一个随机id ,这正是我想要的。

但是,当我将前一个 SQL 语句包装在另一个 SQL 语句中以获取朋友的nameid (来自子查询中的id )时,结果随机返回为空或 1 个朋友或 2 个朋友或所有 3 个朋友:

SELECT id, name FROM profile
WHERE id = (
    SELECT t1.sender_id AS Connections FROM
    
                (SELECT DISTINCT sender_id
                FROM connection
                WHERE receiver_id = 'my_id'
                AND status = 'Approved') t1
                UNION ALL                 
    SELECT t2.receiver_id FROM
                (SELECT DISTINCT receiver_id
                FROM connection
                WHERE sender_id = 'my_id'
                AND status = 'Approved') t2
    ORDER BY RAND() LIMIT 1);

我希望它发出与第一个代码片段相同的行为。

问题是正在为profile中测试的每一行重新执行子查询。 每次返回不同的随机ID; 如果该 ID 恰好与profile的当前行匹配,则返回该行。

不要使用WHERE id = ,而是使用JOIN 这将只运行一次子查询。

SELECT p.id, p.name
FROM profile AS p
JOIN (
    SELECT t1.sender_id AS Connections FROM
    
                (SELECT DISTINCT sender_id
                FROM connection
                WHERE receiver_id = 'my_id'
                AND status = 'Approved') t1
                UNION ALL                 
    SELECT t2.receiver_id FROM
                (SELECT DISTINCT receiver_id
                FROM connection
                WHERE sender_id = 'my_id'
                AND status = 'Approved') t2
    ORDER BY RAND() LIMIT 1) AS r
ON p.id = r.Connections

你真的要求所有的sender_ids和一个receiver_id吗?

感觉就像你有一层额外的SELECTs

如有疑问,请添加额外的括号:

( SELECT ... ) 
UNION ALL
( SELECT ... ORDER BY ...)   -- this ORDER BY applies only to the select
ORDER BY ...    -- This applies to the result of the UNION, not the second select

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM