代码之家  ›  专栏  ›  技术社区  ›  jnbdz

我如何在MySQL中获得n个连接结果

  •  0
  • jnbdz  · 技术社区  · 7 年前

    现在我正在使用一个循环来遍历我拥有的100个ID。循环的每次迭代都对数据库进行查询。在我看来,这根本没有效率。我想把它放在一个查询中。但至少可以说,这不是我自己的方式。

    这是我一直在玩弄的问题。它应该能让我清楚地知道我在做什么。

    SELECT
        festival_backers.clown_id,
        festival_backers.user_id
    FROM festival_backers
    INNER JOIN users ON users.id = festival_backers.user_id
    LEFT JOIN festival_backers AS lesser ON lesser.festival_id = 1632 AND lesser.clown_id = festival_backers.clown_id
    WHERE festival_backers.festival_id = 1632
      AND lesser.clown_id IN (136541, 1000376982, 222329...)
      AND lesser.user_id NOT IN (136541, 1000376982, 222329...)
    GROUP BY festival_backers.clown_id
    HAVING COUNT(lesser.clown_id) < 3
    ORDER BY (festival_backers.amount + (festival_backers.free_vote / 10)) DESC
    LIMIT 300;
    

    我对这个问题一窍不通。

    我正在寻找的结果。

    clown_id    | user_id
    -----------------------------
    136541      | 21324
    136541      | 57889
    136541      | 89632
    1000376982  | 56432
    1000376982  | 57343
    1000376982  | 23345
    222329      | 45456
    222329      | 77854
    222329      | 67789
    

    我正试图让那些支持小丑的用户参与进来。但其中只有三个,仅此而已。我可以在哪里查询到超过三个,但这并不好(它们太多了)。

    我使用 NOT IN (以下示例)是因为 user_id 也用于小丑,因为他们也是用户。

    AND lesser.user_id NOT IN [...]
    

    我试着这么做: https://stackoverflow.com/a/30269273/736910

    有没有一种方法可以使用一个函数或其他东西来限制一个连接返回的结果量为3?还是有其他方法可以达到我想要的结果?

    使现代化

    我有不同的疑问。。。下面是另一个也不返回任何内容的示例:

    SELECT
            festival_backers.clown_id,
            festival_backers.user_id
        FROM festival_backers
        INNER JOIN users ON users.id = festival_backers.user_id
        INNER JOIN festival_backers AS lesser ON lesser.festival_id = 1632 AND lesser.clown_id = festival_backers.clown_id
        WHERE festival_backers.festival_id = 1632
          AND lesser.clown_id IN (136541, 1000376982, 222329...)
          AND lesser.user_id NOT IN (136541, 1000376982, 222329...)
        GROUP BY festival_backers.clown_id
        HAVING COUNT(festival_backers.clown_id) < 3
        ORDER BY (festival_backers.amount + (festival_backers.free_vote / 10)) DESC
        LIMIT 300;
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Barmar    7 年前

    基于 this answer 从你链接到的问题。

    SELECT b.clown_id, b.user_id   
    FROM festival_backers AS b
    LEFT JOIN festival_backers AS lesser 
        ON b.clown_id = lesser.clown_id 
        AND b.user_id < lesser.user_id
        AND lesser.user_id NOT IN (136541, 1000376982, 222329...)
    WHERE b.festival_id = 1632
    AND b.clown_id IN (136541, 1000376982, 222329...)
    AND b.user_id NOT IN (136541, 1000376982, 222329...)
    GROUP BY b.clown_id, b.user_id
    HAVING COUNT(lesser.user_id) <= 5
    

    请注意 lesser 你要比较的表格必须放在 ON 条款,而不是 WHERE 条款

    这将为每个小丑ID返回5个最低的用户ID。如果您想按用户ID以外的其他属性排序,请更改 b.user_id < lesser.user_id b.otherColumn < lesser.otherColumn .