3

私は mysql クエリに関しては比較的初心者なので、頭を噛まないでください。ポーリング拡張機能と Jomsocial を使用して「トップ ポーラー」モジュールを作成しようとしています。作成した投票数の上位 5 人のユーザーを表示したいと考えています。これがデータテーブルの構造です(重要な部分です)

#__users
-id
-name
-username

#_jcp_polls
-created_by (this is the same as #users.id)

#__community_users
-thumb
-avatar

これが私のクエリです

$db = JFactory::getDBO();

$query = "SELECT u.id, u.username, u.name, c.thumb, c.avatar,COUNT(p.created_by) as total
      FROM #__users u, #__community_users c, #__jcp_polls p 
      WHERE u.id = p.created_by
      GROUP by u.id
  ORDER BY total DESC
      LIMIT $user_count
     ";

$db->setQuery($query);
$rows = $db->loadObjectList();

次のような foreach ループでユーザー テーブル フィールドを表示できます。

foreach($rows as $row){
 echo $row->name
}

使えると思っ$row->avatarたけどダメ。#__community_users誰かが、テーブルと同様にフィールドを表示できるようにするクエリを提案できますか#__users table? #__jcp_polls table?からのランキングを維持します。

4

1 に答える 1

3

#__community_users現在、 に参加する条件はありません#__users。に関連する列があるINNER JOINと仮定して、暗黙的な結合を明示的な s に交換した更新されたクエリを次に示します。上記のテーブル構造には、 に関連する列がありません。これがないと、アバターをユーザーに関連付けることができません。#__community_usersuser_id#__users.id#__community_users#__users

SELECT 
  u.id, u.username, u.name, c.thumb, c.avatar,COUNT(p.created_by) as total
FROM 
  #__users u 
  /* Supply the correct column name for c.user_id */
  JOIN #__community_users c ON u.id = c.user_id
  /* LEFT JOIN used to list 0 for users who have no polls */
  LEFT JOIN #__jcp_polls p ON u.id = p.created_by
GROUP by u.id
ORDER BY total DESC
LIMIT $user_count

ユーザーがアバターを持っていない可能性がある場合は、LEFT JOINに対してを使用し#__community_usersます。

SELECT 
  u.id, u.username, u.name, c.thumb, c.avatar,COUNT(p.created_by) as total
FROM 
  #__users u 
  /* Supply the correct column name for c.user_id */
  LEFT JOIN #__community_users c ON u.id = c.user_id
  /* LEFT JOIN used to list 0 for users who have no polls */
  LEFT JOIN #__jcp_polls p ON u.id = p.created_by
GROUP by u.id
ORDER BY total DESC
LIMIT $user_count

構文はMySQLでは有効ですが、SELECTリストには複数の列がu.idあり、GROUP BY. クエリのより移植性の高いバージョンは次のようになります。

SELECT
  u.id, u.username, u.name, c.thumb, c.avatar, p.total
FROM
  #__users u 
  LEFT JOIN #__community_users c ON u.id = c.user_id
  /* Left Join against a subquery that returns count per user */
  LEFT JOIN (SELECT created_by, COUNT(*) AS total FROM #__jcp_polls GROUP BY created_by) p ON u.id = p.created_by
ORDER BY total DESC
LIMIT $user_count
于 2012-08-29T20:19:16.433 に答える