【问题标题】:How to write query to keep getting rows until a condition is satsified如何编写查询以不断获取行直到满足条件
【发布时间】:2012-02-02 13:26:09
【问题描述】:

假设我有以下表格:

表格:主题
列:topicId

表:topicPermissions
列:topicId、teamId

我想编写一个查询来提取 10 个唯一主题 ID 及其所有关联的权限行。每个主题 id 可以有多个 topicPermission 行分配给它,但我只想要 10 个不同的主题 id。

SELECT topic.topicId, topicPermission.teamId FROM topic LEFT JOIN topicPermissions ON topicId LIMIT 10

显然这不起作用,因为它限制为 10 行。任何帮助表示赞赏。

进一步澄清:实现此目的的另一种方法是不断从主题权限中提取行,直到主题权限具有 10 个不同的主题 ID。这可能吗?

谢谢。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    这可能有效:

    SELECT `TP`.`topicId`, `PM`.`teamId`
    FROM (SELECT `topicId`
        FROM `topic`
        LIMIT 10
    ) `TP`
    LEFT JOIN `topicPermissions` `PM` ON `TP`.`topicId` = `PM`.`topicId`;
    

    希望对你有帮助!

    编辑 1: 这是上述查询的测试运行。

    表“topic”有13条记录:

    mysql> select * from topic;
    +---------+
    | topicId |
    +---------+
    |       1 |
    |       2 |
    |       3 |
    |       4 |
    |       5 |
    |       6 |
    |       7 |
    |       8 |
    |       9 |
    |      10 |
    |      11 |
    |      12 |
    |      13 |
    +---------+
    13 rows in set (0.00 sec)
    

    表“topicPermissions”有 4 个 topicId = 1 的条目和 2 个 topicId = 5 的条目:

    mysql> select * from topicPermissions;
    +---------+--------+
    | topicId | teamId |
    +---------+--------+
    |       1 |      1 |
    |       1 |      2 |
    |       1 |      3 |
    |       1 |      4 |
    |       5 |      1 |
    |       5 |      9 |
    +---------+--------+
    6 rows in set (0.00 sec)
    

    结果:

    mysql> SELECT `TP`.`topicId`, `PM`.`teamId`
        -> FROM (SELECT `topicId`
        ->     FROM `topic`
        ->     LIMIT 10
        -> ) `TP`
        -> LEFT JOIN `topicPermissions` `PM` ON `TP`.`topicId` = `PM`.`topicId`;
    +---------+--------+
    | topicId | teamId |
    +---------+--------+
    |       1 |      1 |
    |       1 |      2 |
    |       1 |      3 |
    |       1 |      4 |
    |       2 |   NULL |
    |       3 |   NULL |
    |       4 |   NULL |
    |       5 |      1 |
    |       5 |      9 |
    |       6 |   NULL |
    |       7 |   NULL |
    |       8 |   NULL |
    |       9 |   NULL |
    |      10 |   NULL |
    +---------+--------+
    14 rows in set (0.00 sec)
    

    我从您的问题中了解到,该查询为您提供了 10 个不同的主题 ID 以及每个主题 ID 的所有 topicPermissions。没有?

    请注意,如果您需要选择特定的主题 ID,您可以更改下面的派生表查询以读取所需的主题:

    SELECT `topicId` FROM `topic` LIMIT 10;
    

    【讨论】:

    • 不,那行不通。它不会提取正确的数据(几乎就像它不知道哪个表?)并且它只提取一个主题 id,即使 topicPermissions 表中有多个具有该主题 id 的行。
    • 它没有提取正确的数据意味着它没有提取正确的主题?您能否分享一下这两个表中条目的一些快照?
    • 如您所知,我大大简化了我的 SQL,但在尝试将您的建议应用于问题时我犯了一个错误。我想通了,它的工作原理!非常感谢。
    【解决方案2】:

    这个怎么样..

    SELECT T.topicId, TP.teamId
    from
    (
    SELECT TOP 10 DISTINCT topicId
    FROM topic
    ) T inner join topicPermissions TP on (TP.topicId = T.topicId)
    

    注意:我在 SQL Server 中编写,因此您可能需要更改一些语法。

    【讨论】:

    • 我发现TOP 10和mysql中的LIMIT 10是一样的。所以我把它改写成这样: SELECT T.topicId, TP.teamId from (SELECT DISTINCT topicId FROM topic LIMIT 3) T inner join topicPermissions TP on (TP.topicId = T.topicId) It pulls 1) topicId 1 - team 1 2) topicId 2 team 2 3) topicId 1 team 2... 它正在停止使用这两个主题 ID,而不是继续到 topicid 3
    猜你喜欢
    • 2021-04-26
    • 2022-11-23
    • 2019-11-07
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 2022-01-10
    • 2021-09-05
    • 1970-01-01
    相关资源
    最近更新 更多