2017-10-07 2 views
0

J'ai une table contacts avec les champs id | city_id | category_id | email.
La requête de base estmysqli: sélectionnez la requête et la limite pour chacun des ID de l'IN

" 
SELECT id 
    , email 
    FROM contacts 
WHERE city_id IN (".implode(',', $arrCity).") 
    AND category_id IN (".implode(',', $arrCategory).") 
" 

Mais je dois fixer une limite: 10 lignes pour chaque catégorie dans la ville. C'est possible?

+0

Voir https://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple- sql-query – Strawberry

Répondre

0

C'est difficile. Dans MySQL, le plus simple est d'utiliser des variables:

SELECT id, email 
FROM (SELECT c.*, 
      (@rn := IF(@cc = CONCAT_WS(':', city_id, category_id), @rn + 1, 
         IF(@cc := CONCAT_WS(':', city_id, category_id), 1, 1) 
         ) 
      ) as rn 
     FROM (SELECT c.* 
      FROM contacts c 
      WHERE city_id IN (".implode(',', $arrCity).") AND 
        category_id IN (".implode(',', $arrCategory).") 
      ORDER BY city_id, category_id 
      ) c CROSS JOIN 
      (SELECT @cc := '', @rn := 0) params 
    ) c 
WHERE rn <= 10; 

Ceci énumère les lignes dans chaque combinaison ville/catégorie. Le WHERE extérieur limite à 10 dans chaque combinaison.

+0

Et maintenant j'ai une erreur 'Unknown column 'city_id' dans 'field list'' au niveau de' '(@rn: = IF (@cc = CONCAT_WS (': ', city_id, category_id), @rn + 1' line et c'est bizarre – fiter

+0

@Fiter ... 'city_id' est dans votre requête d'origine –

+0

Pourquoi est-ce que ce sera downvoted? –