【问题标题】:How can I take a UNION of two separate sql queries and get only DISTINCT values如何获取两个单独的 sql 查询的 UNION 并仅获取 DISTINCT 值
【发布时间】:2010-12-28 21:15:41
【问题描述】:

如何在 PHP 中仅从我的这两个查询中获取不同的值:

$query1 = "SELECT g.name, g.hash, g.views
                    FROM c7_groups g, c7_groups_affiliations ga
                    WHERE g.category >= 592 AND g.category <= 622
                        AND ga.affiliated_groups_hash = g.hash
                        AND LOWER(g.name) LIKE LOWER('%$school_name%')
                        ";
        $query2 = "SELECT g.name, g.hash, g.views
                    FROM c7_groups g, c7_groups_affiliations ga, c7_affiliations a
                    WHERE ga.affiliations_id = a.id
                        AND ga.groups_hash = g.hash
                        AND LOWER(a.name) LIKE LOWER('%$school_name%')";

我只想从这两个查询中获取不同的“g.hash”。如果我可以有一个可以同时完成这两项任务的 sql 查询,那就更好了。

关于我的数据库表的详细信息如下: c7_groups: id int(10)
名称 varchar(255)
哈希 varchar(32) groups_categories_id int(10) 视图 int(10)

c7_affiliations id int(10) 名称 varchar(100)
groups_categories_id int(10)

c7_groups_affiliations groups_hash varchar(32) 附属的_groups_hash varchar(32)--------FKey to c7_groups.hash
affiliations_id int(10)--------C7_affiliations.id 的 FKey
id int(10)

affiliated_groups_hash 和 affiliations_id 都可以为空,或者我应该说其中一个或它们始终为空。如果一个群组隶属于另一个群组,则 affiliations_id 将为空,如果该群组隶属于另一个联盟,则affiliated_groups_hash 将为空。

如果您需要有关任何事情的更多详细信息,请告诉我。

问候 泽山

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    只需在子选择中进行联合,然后按派生表分组。

    select name,count(*) from
    (
                   SELECT g.name, g.hash, g.views
                        FROM c7_groups g, c7_groups_affiliations ga
                        WHERE g.category >= 592 AND g.category <= 622
                            AND ga.affiliated_groups_hash = g.hash
                            AND LOWER(g.name) LIKE LOWER('%$school_name%')
         UNION
                   SELECT g.name, g.hash, g.views
                        FROM c7_groups g, c7_groups_affiliations ga, c7_affiliations a
                        WHERE ga.affiliations_id = a.id
                            AND ga.groups_hash = g.hash
                            AND LOWER(a.name) LIKE LOWER('%$school_name%')";
    ) as myTbl
    group by name
    

    【讨论】:

    • 您也可以使用distinct 代替聚合。
    【解决方案2】:

    试试这个

    SELECT Distinct 
               g.name, g.hash, g.views
                        FROM c7_groups g, c7_groups_affiliations ga
                        WHERE g.category >= 592 AND g.category <= 622
                            AND ga.affiliated_groups_hash = g.hash
                            AND LOWER(g.name) LIKE LOWER('%$school_name%')
    UNION
    SELECT 
               g.name, g.hash, g.views
                        FROM c7_groups g, c7_groups_affiliations ga, c7_affiliations a
                        WHERE ga.affiliations_id = a.id
                            AND ga.groups_hash = g.hash
                            AND LOWER(a.name) LIKE LOWER('%$school_name%')
    

    【讨论】:

    • 我为您格式化了您的代码。我所做的只是突出显示该语句并按下 {} 按钮
    【解决方案3】:

    似乎第一个查询和第二个查询之间的唯一区别是有一个连接。如果您使用 ANSI-92 连接,可能会是这样,并且不需要 UNION。

              SELECT DISTINCT 
                       g.name, 
                       g.hash,
                       g.views
                FROM 
                        c7_groups g
                      INNER JOIN  c7_groups_affiliations ga
                      ON ga.affiliated_groups_hash = g.hash
                      LEFT JOIN c7_affiliations a
                       on ga.affiliations_id = a.id
    
                WHERE 
                    (LOWER(g.name) LIKE LOWER('%$school_name%')
                     AND g.category >= 592 AND g.category <= 622 
                     AND  a.ID is null)
                    OR 
                     (LOWER(a.name) LIKE LOWER('%$school_name%')
                     and a.ID is NOT null)
    

    从技术上讲,第二部分中的 a.ID is NOT null 不是必需的,因为 LOWER(a.name) LIKE LOWER('%$school_name%') 会这样做,但它可以更清楚地说明发生了什么

    【讨论】:

    • 不,您错过了一个标准。如果该组与另一个隶属关系有隶属关系,则检查标准必须是:“LOWER(a.name) LIKE LOWER('%$school_name%')”
    • @Zeeshan Rang。谢谢。奇怪的是,它让它更清晰了一点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多