2

この関数を使用して、パラメーターに応じてテーブルからアイテムをリストしhelpsています: (ほとんどのコードを含めましたが、実際には mysql クエリに集中することができます)

function list_helps($by,$value,$page = -1,$ipp = 20){
    /* Yes I concatenate querys... so i use some variables to help it a bit */
    $sql = 'SELECT helps.* FROM helps ';
    $where = ''; $orderBy = ''; $in = ''; $join = ''; $limit = '';  $resultitems = ''; $header = '';
    if($page > 0)   $limit = 'LIMIT '.$page*$ipp.', '.($page+1)*$ipp; else $limit = 'LIMIT 10';
    switch($by){

        case 'byuser':
            $where = 'WHERE id_user ='.$value;
            $orderBy = 'ORDER BY id DESC';
            break;
        case 'byfriend':
            $sql = 'SELECT
              h.*,
              f.* 
            FROM (
              SELECT
                id,
                CASE followerid WHEN '.$value.' THEN followingid ELSE followerid END AS friend_id
              FROM friends
              WHERE acepted = 1
                AND (followerid  = '.$value.' OR followingid = '.$value.')
            ) AS f
              INNER JOIN helps AS h ON h.id_user = f.friend_id
              ORDER BY h.id DESC';
            break;
        default:
            break;
    }
    $sql .= $where.' '.$orderBy.' '.$limit;
    $res = cache_query($sql,'',60*60*5);
    /* checks in cache first, if not; executes query.. next code it's to render content */
}

もっと多くのケースがありますが、これらの 2 つに焦点を当てましょう。

どちらも、要求されている「ヘルプ」を提供します (ユーザーの場合、またはユーザーの友人の場合)。問題は、それらのコメントを取得しようとしているときです (ブログ投稿の場合など)。私はそうしています:

res = cache_query('SELECT help_replies.content, help_replies.date, 
            help_replies.offers, help_replies.accepted, help_replies.id_responds,
            usuarios.first_name, usuarios.last_name, usuarios.avatar,usuarios.id
        FROM help_replies left join usuarios 
            ON  help_replies.id_user = usuarios.id
        WHERE  help_replies.id_responds = '.$this->id.' 
        ORDER BY help_replies.id ASC', '', 30);

foreach($res as $obj) {
    /* $obj['id_responds'] */
    }
}

問題は、アイテムを参照することです。そのhelp_replies.id_respondsため、ケースが「byuser」の場合は問題ありません。しかし、ケースが「byfriend」の場合、このフィールドは失われます (したがって、常に同じコメントが表示されます)

結論:

  • byuser -> Helps fine & comments fine
  • byfriend -> うまくいきます (これは奇妙です) & コメントが間違っています

$this->id が (JOINED) クエリから期待どおりにならない理由はありますか?

-編集-

$this->id は、この構成メソッドから取得されます (多くの属性を省略しました)

function __construct($item) {
    $this->id = $item['id'];
    $this->id_user = $item['id_user'];
    ..  
}

$item は foreach の 1 つの反復です (したがって、返された行は配列に変換されます)

ムチャス・グラシアス

4

1 に答える 1

4

byfriendsによって実行されたクエリは、 2 回function list_helps(...)ラベル付けされたフィールドを返すように見えます。idサブクエリの一部として、テーブルに対して1回helps、次にテーブルfのエイリアスに対して1回friends

ヘルプ IDではなくフレンド ID$this->id含まれている場合、コメント クエリ ( ) は間違った結果を返すと想像できます。help_replies

したがって、表示されているように、友人 ID のエイリアスを使用してサブクエリを変更すると、id AS friendsId,すべてが期待どおりに機能するでしょうか?

function list_helps($by,$value,$page = -1,$ipp = 20){
    ...
    ...
    case 'byfriend':
        $sql = 'SELECT
            h.*,
            f.* 
        FROM (
            SELECT
                id  AS friendsId,
                CASE followerid WHEN '.$value.' THEN followingid ELSE followerid END AS friend_id
            FROM friends
            WHERE acepted = 1
            AND (followerid  = '.$value.' OR followingid = '.$value.')
        ) AS f
            INNER JOIN helps AS h ON h.id_user = f.friend_id
            ORDER BY h.id DESC';
        break;

まさにこの理由から、テーブル識別子フィールドに名前を付ける習慣があり、<tablename>Idどこでもエイリアスを使用する必要がありません。

于 2012-06-25T05:44:30.597 に答える