0

プロフィール写真、出身地、ユーザーID、特定のユーザーとの友達をリクエストしたユーザーのフルネームを表示する友達リクエストスクリプトを選択する次のクエリがあります。

SELECT 
    a.hometown, 
    a.first_name, 
    a.uid, 
    a.last_name, 
    b.friend_one, 
    b.friend_two, 
    b.friend_request_id, 
    p.thumbnail 
FROM 
    users a, 
    friend_requester b, 
    profile_pics p 
WHERE 
    a.uid = b.friend_one 
AND b.friend_two = $uid 
AND p.uid_fk = $uid 
ORDER BY b.created DESC LIMIT 5

私の問題は、friend_requesterテーブルで見つかったクエリごとに1人のユーザーを返す代わりに、たとえば、異なるプロフィール写真を持つ同じユーザーの3つのインスタンスを返すことです。したがって、ユーザーが3つのプロフィール写真をアップロードした場合、これらは次のように保存されます。

id=1, profile_pic=profile_pic1.jpg...

id=1 profile_pic=profile_pic2.jpg... 

id=1 profile_pic=profile_pic3.jpg...

ログインしたユーザーと友達になるように求める同じユーザーの3つの異なるボックスが表示されます。

Hituptonyが述べたように、「created」列の「profile_pics」テーブルから最新の挿入画像を選択したいと思います。

4

3 に答える 3

1

GROUP BY Uid_FKで、最大値を作成し、INNERを画像テーブルに戻します(「MaxPic」というサブクエリで実行)

SELECT  a.hometown, 
        a.first_name, 
        a.uid, 
        a.last_name, 
        b.friend_one, 
        b.friend_two, 
        b.friend_request_id, 
        p.thumbnail 
FROM    users a
        INNER JOIN friend_requester b 
            ON b.friend_one = a.uid
        INNER JOIN profile_pics p 
            ON p.uid_fk = b.frind_two
        INNER JOIN
        (   SELECT  uid_FK, MAX(Created) AS Created
            FROM    Profile_Pics
            GROUP BY uid_FK
        ) MaxPic
            ON MaxPic.UID_FK = p.UID_FK
            AND MaxPic.Created = p.Created
WHERE   p.uid_fk = $uid
于 2012-06-11T17:21:42.643 に答える
0

それで、あなたはどの絵が欲しいですか?画像にはそれに関連するタイムスタンプが必要です。おそらく、画像の日付を取得して、最新の画像を表示するためにNOW()またはcurdate()に最も近いものを取得できます。^^ order byでグループ化できるとは思いませんが、b.createdを選択して、画像を取得する順序を確認する必要があります。

于 2012-06-11T16:46:04.163 に答える
0

結合に新しい派生テーブルを追加できる場合は、次のように実行できます。

 SELECT a.hometown, a.first_name, a.uid, a.last_name, 
        b.friend_one, b.friend_two, b.friend_request_id,
        p.thumbnail  
 FROM users a, 
      friend_requester b,
      (Select MAX(Created) as Created, uid_fk from profile_pics) p_date,
      profile_pics p
WHERE      
      a.uid = b.friend_one AND b.friend_two = $uid  AND p.uid_fk = $uid 
      AND p_date.Created=p.Created And p_date.uid_fk=p.uid_fk
ORDER BY b.created DESC LIMIT 5

または、画像が最新の場合は1、それ以外の場合は0を含む「フラグ」列を画像テーブルに含めることもできます。このタイプの問題は、データベースとして頻繁に発生するようです。成長し、古い写真がある場合、毎回すべてのエントリをチェックする必要があると、パフォーマンスの問題が発生します。フラグを使用すると、パフォーマンスのインデックスをはるかに簡単に作成できます。また、このクエリは単に追加する必要があります:whereflag=1。新しい画像を挿入するたびに、フラグ1を作成し、他のすべてのユーザーのフラグを0に設定します。

乾杯、デビッド

于 2012-06-11T17:33:25.957 に答える