0

友達の最新のアクティビティを表示できるようにしていますが、一度に表示できるのは 5 つだけです。5人のうち、あなたの時間が他のどの友達よりも多い場合は、1人を複数回持つことができます. 「フレンドがスキルネームの日付をレベルアップしました」というように、最新のものを 5 つ表示します。私のコードは次のようなものです:

function recentActivityF($user){
include "mysql.ws";
$query = mysql_query("SELECT u.* FROM friends uf inner join users u on uf.friend = u.username WHERE uf.user = '$user' ORDER BY u.username") or die(mysql_error());
while($row = mysql_fetch_array($query)){
    $friends = $row['username'];    
            //$query2 = mysql_query("SELECT * FROM recentactivity WHERE user LIKE '".$friends."' ORDER BY time DESC LIMIT 1") or die(mysql_error());
        $query2 = mysql_query("SELECT u.* FROM recentactivity uf inner join friends u on uf.user = u.friend WHERE uf.user LIKE '".$friends."' ORDER BY uf.time DESC LIMIT 1") or die(mysql_error());
            $query3 = mysql_query("SELECT * FROM skills WHERE playerName LIKE '".$friends."' LIMIT 1") or die(mysql_error());
        while($row3 = mysql_fetch_array($query3)){
         while($row2 = mysql_fetch_array($query2)){
        $date = $row2['time'];
        $skillRow = $row2['skill']+1;
        $skill = findType($skillRow)."xp";
        $skillName = findType($skillRow);
                echo'Friend: '.$friends.' Levelled Up '.$skillName.' Date: '.$date.'';
              }
            }
         }
       }

結果は次のようになります。

1.)Friend: mark Levelled Up Attack date: 28-Aug-2012 09:48
2.)Friend: matt Levelled Up Strength date: 28-Aug-2012 09:47
3.)Friend: kevin Levelled Up Attack date: 28-Aug-2012 09:46
4.)Friend: mark Levelled Up Strength date: 28-Aug-2012 09:45
5.)Friend: april Levelled Up Magic date: 28-Aug-2012 09:44

私の結果は次のとおりです。

1.)Friend: mark Levelled Up Attack date: 28-Aug-2012 09:48
2.)Friend: mark Levelled Up Strength date: 28-Aug-2012 09:45
3.)Friend: matt Levelled Up Strength date: 28-Aug-2012 09:47
4.)Friend: kevin Levelled Up Attack date: 28-Aug-2012 09:46
5.)Friend: april Levelled Up Magic date: 28-Aug-2012 09:44
6.)Friend: april Levelled Up Strength date: 28-Aug-2012 09:45

SQL:

    CREATE TABLE `friends` (
  `user` varchar(32) NOT NULL,
  `friend` varchar(32) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `friends` (`user`, `friend`) VALUES
('Cls Prod', 'pro skiller'),
('Cls Prod', 'polo303'),
('Cls Prod', 'pjtips123'),
('Cls Prod', 'tommy0581'),
('Cls Prod', 'sageofmali');

CREATE TABLE `users` (
  `username` varchar(255) NOT NULL DEFAULT '',
  `password` varchar(255) DEFAULT NULL,
  `rights` varchar(255) DEFAULT NULL,
  `online` tinyint(1) NOT NULL,
  `friends` text,
  `donator` double DEFAULT NULL,
  `time` bigint(20) NOT NULL,
  PRIMARY KEY (`username`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO `users` (`username`, `password`, `rights`, `online`, `friends`, `donator`, `time`) VALUES
('Cls Prod', 'password', '0', 0, NULL, NULL, 0);

CREATE TABLE `recentactivity` (
  `user` varchar(255) NOT NULL,
  `skill` int(11) NOT NULL,
  `time` varchar(255) NOT NULL,
  `killed` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


INSERT INTO `recentactivity` (`user`, `skill`, `time`, `killed`) VALUES
('Cls Prod', 2, '27-Aug-2012 16:06:40', '');

したがって、コメントされた $query2 は各友達から 1 人を表示しますが、5 人以上を表示します。表示される最新の友達のアクティビティを 5 人だけに制限したいと思います。何か助けはありますか?

4

2 に答える 2

1

スキルからスキル名への変換を自分で行っていることに気付きました。これで十分なはずです。

SELECT f.user AS username, a.time, a.skill
FROM
  friends f
  JOIN recentactivity a ON(a.user = f.user)
WHERE
 f.friend = $username
GROUP BY a.user -- only one event per friend
ORDER BY a.time DESC
LIMIT 5

ここでデモを参照してください: http://sqlfiddle.com/#!2/66f53/6


編集:これはあなたがする必要があるすべてです:

function recentActivityF($user){
  include "mysql.ws";
  $query = <<<EOD
SELECT f.user AS username, a.time, a.skill
FROM
  friends f
  JOIN recentactivity a ON(a.user = f.user)
WHERE
 f.friend = $user
GROUP BY a.user -- only one event per friend
ORDER BY a.time DESC
LIMIT 5
EOD;

  mysql_query($query);
  while($row = mysql_fetch_array($query)) {
    $friend_name = $row['username'];
    $date = $row['time'];
    $skillRow = $row['skill']+1;
    $skillName = findType($skillRow);
    echo'Friend: '.$friend_name.' Levelled Up '.$skillName.' Date: '.$date.'';
  }

PS Standard Stack-Overflow 免責事項: mysql 拡張機能は非推奨です。PDO または mysqli を使用してください。

于 2012-08-29T01:58:18.033 に答える
0

SQL 制限を使用します。

基本的な使用法は次のとおりです。

SELECT * FROM table LIMIT 5

レコード 6 ~ 10 を返したい場合:

SELECT * FROM table LIMIT 5,5

良い例を示すために、あなたのコードを見てみましょう。コードのどこで使用する必要があるかは明らかではありません。


コードを少し調べたところ、最初のクエリは必要ないようです。あなたはできるはずです:

SELECT u.*
FROM recentactivity uf
INNER JOIN friends u ON uf.user = u.friend
WHERE u.user = $user
ORDER BY uf.time DESC
LIMIT 5

必要なすべての情報を取得するには、より多くのフィールドを選択する必要がある場合がありますが、これによりrecentactivity、特定のユーザーのすべてのレコードが最新順に並べ替えられ、上位 5 つに制限されるはずです。

于 2012-08-29T01:41:43.037 に答える