2011-10-17 2 views
0

J'utilise une requête comme:limitation de requête Mysql

$querym = mysql_query("SELECT * FROM allmembers a LEFT JOIN favorites f ON (f.memberid=a.memberid) order by f.date desc LIMIT 10"); 

while($row = mysql_fetch_array($querym,MYSQL_ASSOC)) { 
$dataArray[$row['memberid']][$row['favoriteid']]=$row; 
} 

Mon but est d'obtenir 10 membres avec leurs 5 derniers favoris dans un tableau. mais comme vous pouvez le deviner, cette requête obtient 10 rangs inclus avec les favoris. Cela signifie que si un membre a 15 favoris, il ne reçoit qu'un seul membre avec 10 favoris au lieu de 10 membres avec ses favoris.

Je ne pouvais pas trouver un moyen facile de limiter l'obtention de favoris pour chaque membre de cette requête. Comment puis-je limiter?

Merci à l'avance

Répondre

1
  1. Ce ne MYSQL FETCH LIMITATION ARRAY, c'est votre limite QUERY.

  2. Essayez quelque chose de votre propre sur ces lignes:

    SELECT memberid,group_concat(favorites_field) FROM allmembers a LEFT JOIN favorites f ON (f.memberid=a.memberid) group by a.memberid order by f.date desc LIMIT 10 
    
+0

1- Désolé pour le titre. Je l'ai mis à jour. – Mertafor

0

Cette requête peut vous donner une meilleure approche

SELECT * FROM favorites f where f.memberid in (SELECT * FROM allmembers limit 10) ORDER BY f.date desc 

bien que vous devez limiter les 5 favoris plus tard, en php ou peu importe. Cela peut fonctionner si vous ne prévoyez pas avoir 10.000 favoris pour un membre (essentiellement parce que vous obtiendrez 10.000+ ROWS juste pour afficher, au maximum, 10 * 5 = 50 lignes.)

Sinon, vous pouvez faire une requête pour chaque membre, ce qui limite à 5 résultats ... (cela signifierait faire 11 requêtes au total ...)

0

la requête suivante fera ce que vous voulez:

SELECT 
    a.id as member_id, 
    a.name, 
    f1.id as favorite_id, 
    f1.link 
FROM 
    allmembers a 
    JOIN favorites f1 ON f1.member = a.id 
    LEFT JOIN favorites f2 ON f2.member = f1.member AND f2.date < f1.date 
GROUP BY 
    a.id, a.name, f1.id, f1.link 
HAVING 
    COUNT(f2.id) < 10 
ORDER BY 
    a.name, f1.id 

il prend la schéma de base de données suivant:

allmembers: 
    id INT 
    name VARCHAR 

favorites: 
    id INT 
    member INT 
    link VARCHAR 

Évidemment, vous devez mettre à jour la requête en fonction de votre propre schéma de base de données.

0

Vous avez beaucoup de façons de le faire, et ils peuvent tous être PERFORMANT jusqu'à une limite, ce que je ferais dans ce cas précis est la suivante:

Obtenez les années id favoris dans un multiple gauche se joignent comme champ séparé, vous pouvez alors facilement (...) le tableau de lignes pour chaque champ et récupérer l'identifiant. La requête ressemblerait à ceci. L'adapter à votre propre usage:

SELECT 
    a.*, 
    f1.favoriteid as f1id, 
    f2.favoriteid as f2id, 
    f3.favoriteid as f3id, 
    f4.favoriteid as f4id, 
    f5.favoriteid as f5id 
FROM allmembers a 
    LEFT JOIN favorites f1 ON (f.memberid=a.memberid) 
    LEFT JOIN favorites f2 ON (f.memberid=a.memberid) AND f1.favoriteid <> f2.favoriteid 
    LEFT JOIN favorites f3 ON (f.memberid=a.memberid) AND f1.favoriteid <> f3.favoriteid AND f2.favoriteid <> f3.favoriteid 
    LEFT JOIN favorites f4 ON (f.memberid=a.memberid) AND f1.favoriteid <> f4.favoriteid AND f2.favoriteid <> f4.favoriteid AND f3.favoriteid <> f4.favoriteid 
    LEFT JOIN favorites f5 ON (f.memberid=a.memberid) AND f1.favoriteid <> f5.favoriteid AND f2.favoriteid <> f5.favoriteid AND f3.favoriteid <> f5.favoriteid AND f4.favoriteid <> f5.favoriteid 

order by f.date desc LIMIT 10 

En utilisant cette méthode, vous pouvez également lire les informations de la table favoris ou même se joindre à gauche sur une autre table X nombre de fois pour obtenir plus d'informations sur ce favori. Tant que vous installez les index corrects, cette méthode est extrêmement rapide, même avec des milliers de membres et près de millions de favoris.

Vous pouvez également appliquer cette stratégie à de nombreux autres scénarios. Par exemple, nous travaillons avec WordPress ici au travail et de nombreuses informations pour les utilisateurs sont conservées en tant que champs méta, donc la sélection d'une grande table est impossible à moins que vous n'effectuiez cette méthode. Bonne chance