0

これはおそらく本当に簡単なことですが、似たような例をいくつか見つけようとして失敗しました。

問題は、データベース内のギャラリーから8つのランダムな画像を、追加された日付でソートして一覧表示したいということです。そして、私はこれをなんとか行うことができましたが、本当に遅くなるいくつかの反復クエリでのみです。それで、誰かが私にそれらを組み合わせてより速い速度にすることについてとても親切に教えてくれるなら、私はUNIONが行く方法だと思いますか?これが私の作業です(ただし、コードは遅いです)

<?php       
        $latestPictures = mysql_query("SELECT pictureID, addedDate FROM picture ORDER BY addedDate DESC LIMIT 8"); 

        $latestConcerts = mysql_query("SELECT concertID, addedDate FROM concert WHERE pictureID is null ORDER BY addedDate DESC LIMIT 8"); 


        // Add concerts and pictures to array
        while($curFestival = mysql_fetch_object($latestPictures))
        {
            $array[$curFestival->addedDate] = "p" . $curFestival->pictureID;
        }

        while($curConcert = mysql_fetch_object($latestConcerts))
        {
            $array[$curConcert->addedDate] = "c" . $curConcert->concertID;
        }

        // Order array by key
        krsort($array);

        $latestArray = array_slice($array, 0, 8);

        foreach($latestArray as $key => $value) {

            $type = substr($value, 0, 1);
            $ID = substr($value, 1);

            // If type == picture
            if($type == 'p')
            {           
                $picturesPicturesID = mysql_query("SELECT concertID, name FROM photo WHERE concertID IN(SELECT concertID FROM concert WHERE pictureID = $ID) ORDER BY photoID");

                // Get random picture
                $curRandomPicture = rand(0, (mysql_num_rows($picturesPicturesID) - 1));
                $curPictureConcertID = mysql_result($picturesPicturesID, $curRandomPicture, "concertID");
                $curPictureName = mysql_result($picturesPicturesID, $curRandomPicture, "name");             
                $curPicture = mysql_fetch_object(mysql_query("SELECT c.URL, p.name FROM concert c, picture p WHERE p.pictureID = c.pictureID AND c.concertID = $curPictureConcertID")); 

             echo "Some image"; 
             }
            // If type == concert
            if($type == 'c')
            {
                $concertPicturesID = mysql_query("SELECT concertID, name FROM photo WHERE concertID = $ID ORDER BY photoID");

                // Get random picture
                $curRandomPicture = rand(0, (mysql_num_rows($concertPicturesID) - 1));  
                $curPictureConcertID = mysql_result($concertPicturesID, $curRandomPicture, "concertID");
                $curPictureName = mysql_result($concertPicturesID, $curRandomPicture, "name");              
                $curPicture = mysql_fetch_object(mysql_query("SELECT URL, name FROM concert WHERE concertID = $curPictureConcertID")); 

            echo "Some image";
            }
        }
?>

テーブルを含めるのを忘れていることに気づきました。テーブルは次のとおりです。

TABLE OF photo:
PKEY: photoID
FKEY: concertID
name

TABLE OF concert:
PKEY: concertID
FKEY: pictureID
name
URL
addedDate

TABLE OF picture
PKEY: pictureID
name
date

したがって、すべての投稿はTABLE photo ANDコンサートの一部ですが、一部の投稿のみがpicture witchの一部であり、異なるアルバムをグループ化するために使用されることがあります。それらが一緒にグループ化されるとき、私はそのグループ化ID(写真)からのランダムな名前の投稿を望みます、そしてそれらが彼ら自身による場合はそこからのランダムな名前の投稿(コンサート)。

4

1 に答える 1

0

アックッ!(ビル・ザ・キャットの悪名高い言葉で。)

コードが実際にデータベースから取得したい結果セットを把握するのは困難です。

このクエリは最も効率的ではありませんが、photosテーブルから 8 つのランダムな行を返します。これらの行は addedDate 順に並べられています。

SELECT r.*, c.*
  FROM (SELECT p.*
          FROM photo p
         WHERE p.concertid IS NOT NULL
         ORDER BY RAND()
         LIMIT 0,8
       ) r
  JOIN concert c
    ON c.concertid = p.concertid
 ORDER BY r.addedDate ASC

非常に大きなphotoテーブルがある場合、これは遅くなります。なぜなら、そのRAND()関数はテーブル内のすべての行に対して呼び出される必要があり、MYSQL は一時的な結果セット (テーブルのコピー) を生成してから並べ替える必要があるためです。その派生列で。

(注:ここでは、photo「ランダムな」行を返したいのはテーブルであると想定しています。それがテーブルconcertidの主キーであり、concertテーブルからの外部キーであると想定していphotoます。あなたが持っていることは明らかですconcertpictureおよびの3 つのテーブルphotoがありますが、どの列が主キーで、どの列が外部キーであるかが明確ではないため、間違っている可能性があります。)

(注: p.*andc.*を、実際に返したい式のリストに置き換えます。)

単一のランダムな行を返すためのより効率的な方法があります。あなたの場合、正確に 8 行が必要であり、おそらく重複を返したくないでしょう。

于 2012-07-09T21:15:09.757 に答える