6 votes

Mysql : obtenir 2 résultats pour chaque chat [one to many relation ship].

Je cherche la meilleure méthode pour obtenir un résultat avec une base de données contenant plus de 100 000 messages et plus de 100 000 chats.

Voici mes tableaux

Chats

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

Poste

--------------------------------------
-  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 | . . . . .|
--------------------------------------

Voici le résultat que je veux obtenir

Résultat

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

Voici la question que je viens d'écrire, mais je cherche la meilleure question.

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

UNION

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

Que se passe-t-il si je veux obtenir 10 chats en une seule requête ?

1voto

Clodoaldo Neto Points 26723
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

Le titre de la question indique chaque catégorie et la question indique 10 catégories. J'ai donc commenté la clause where pour la rendre facultative.

-3voto

vivek raut Points 60

Pour de meilleures performances, utilisez l'option exists clause

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

Vérifiez le sqlfiddle .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X