【问题标题】:Mysql: get 2 result from every cat [one to many relation ship]Mysql:从每只猫获得2个结果[一对多关系]
【发布时间】:2012-09-16 22:10:34
【问题描述】:

我正在寻找获得结果的最佳方法,数据库包含超过 100000 条帖子和超过 100000 只猫

这是我的桌子

-----------------
-  id   | name  |
-----------------
-  1    | x     |
-----------------
-  2    | y     |
-----------------

发帖

--------------------------------------
-  id   | cat_id | title  | content  |
--------------------------------------
-  1    | 1      | Post 1 | .. . .  .|
--------------------------------------
-  2    | 1      | Post 2 | . . . . .|
--------------------------------------
-  3    | 2      | Post 3 | .. . .  .|
--------------------------------------
-  4    | 1      | Post 4 | . . . . .|
--------------------------------------
-  5    | 1      | Post 5 | .. . .  .|
--------------------------------------
-  6    | 2      | Post 6 | . . . . .|
--------------------------------------
-  7    | 1      | Post 7 | .. . .  .|
--------------------------------------
-  8    | 2      | Post 8 | . . . . .|
--------------------------------------

这是我想要得到的结果

结果

--------------------------------------
-Postid | cat_id | title  | content  |
--------------------------------------
-  1    | 1      | Post 1 | .. . .  .|
--------------------------------------
-  2    | 1      | Post 2 | . . . . .|
--------------------------------------
-  3    | 2      | Post 3 | .. . .  .|
--------------------------------------
-  6    | 2      | Post 4 | . . . . .|
--------------------------------------

这是我刚写的查询,但我正在寻找最佳查询

SELECT
  *
From 
  post
WHERE posts.cat_id = 1 limit 2

UNION

SELECT
  * 
From 
  post
WHERE posts.cat_id = 2 limit 2

如果我想在一个查询中从 10 只猫中获取信息,会发生什么情况

【问题讨论】:

  • 无订单,请看我的查询,你能理解我
  • 可以在WHERE子句中使用IN()选择多条记录吗?
  • 我怎样才能为每只猫获得 2 条记录

标签: mysql sql performance join


【解决方案1】:

为了获得更好的性能,请使用exists 子句

select * from posts p where exists
(select c.id from cats c)

检查sqlfiddle

【讨论】:

  • 不是 OP 想要的,他想要得到,对于每个类别 id,只返回两个帖子 [1-10] 中的类别 id
【解决方案2】:
set @i := 0, @cat_id = 0;
select 
    post.id as Postid,
    cat_id,
    title,
    content
from 
    post
    inner join (
    select 
        id,
        case 
            when @cat_id = cat_id then @i := @i + 1
            else @i := 1
        end as i,
        case when @cat_id != cat_id then @cat_id := cat_id end
    from (
        select id, cat_id
        from post
        -- where cat_id in (1, 2) uncomment this to limit categories
        order by cat_id
    ) a
) s on s.id = post.id
where i <= 2
order by cat_id, post.id

问题标题表示每个类别,问题表示 10 个类别,所以我评论了 where 子句以使其成为可选。

【讨论】:

  • 谢谢你:),我明白了:)
猜你喜欢
  • 2021-10-31
  • 2018-11-09
  • 2020-06-06
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 2020-08-22
  • 2020-07-25
  • 2014-02-08
相关资源
最近更新 更多