2011-10-17 19 views
0

私は、クエリを使用してのように: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; 
} 

私の目的は、アレイ内の彼らの最後の5人のお気に入りと10人のメンバーを取得しています。 10行がお気に入りに含まれているこのクエリを推測することができます。つまり、あるメンバーが15のお気に入りを持っている場合、10人のメンバーではなく、10人のお気に入りで1人のメンバーしか得られません。

そのクエリの各メンバーのお気に入りを取得するのを簡単に見つけることができませんでした。どうすれば制限できますか?事前

答えて

1
  1. これはMYSQLはARRAY制限をFETCHされていない中

    おかげで、これはあなたのQUERYの制限です。

  2. は、これらのラインにあなた自身の何かを試してみてください。

    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つ申し訳ありません。私はそれを更新しました。 – Mertafor

0

あなたがPHPで、後から5人のお気に入りを制限する必要がありますが、このクエリは、あなたに

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

をより良いアプローチを与える可能性または何でも。これは、あなたが1人のメンバーに10.000のお気に入りを持っていると予想されない場合に機能します(基本的に、10.000+行を表示するには最大で10 * 5 = 50行です)。

また、 5つの結果にそれを制限する各メンバーのクエリ、...(これは、合計で11個のクエリを実行する意味します...)

0

次のクエリは、あなたがやりたいことになります。

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 

それは想定してい以下のデータベーススキーマ:

allmembers: 
    id INT 
    name VARCHAR 

favorites: 
    id INT 
    member INT 
    link VARCHAR 

明らかに、独自のデータベーススキーマに従ってクエリを更新する必要があります。

0

あなたはそれを行うには多くの方法を持っている、と彼らはすべての私は、この特定のケースで行うだろう何を、限界までパフォーマンスすることができますが、このです:

複数の左のidのお気に入りは、として参加しなさい個別のフィールドを使用すると、各フィールドの行配列を簡単に(...)検索してIDを取得できます。クエリはこれを見ています。あなた自身の使用に適応させる:

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 

このメソッドを使用して、あなたもお気に入りのテーブルから任意の情報を読み取るか、それさえも好きなに関するより多くの情報を得るために時間の別のテーブルのX番号に参加左にすることができます。正しいインデックスを設定する限り、この方法は何千人ものメンバーや数百万のお気に入りであっても非常に高速です。

この戦略を他の多くのシナリオに適用することもできます。たとえば、仕事中にWordPressで作業し、ユーザーの情報がメタフィールドとして保持されるため、この方法を実行しない限り大きなテーブルを1つ選択することは不可能です。

幸運