2017-06-09 7 views
0

私は各カテゴリーから3つのランダムな画像を選択するスクリプトを実行する評価サイトで毎日cronjobを実行しています。訪問者は「画像1対画像2」のように画像を評価できます"これは非常にうまくいく。問題があるデータベース内の同じ番号の2つの行が選択されていないことを確認するにはどうすればよいですか?

がのがと仮定しましょう画像の同じタイプの2があると言うことができます

  • ID 1は、フォードマスタングGTの正面にある
  • ID 2は、フォードマスタングGTですid 1とわずかに異なる正面図

これは、id 1とid 2の両方が選択されている場合、2つのかなり同じ画像がそれぞれ他の?だから、私はこのケース番号1及び番号2簡略化におけるように同じ同じ番号を表す画像を与える「分離カラム」を作成し、両方有するセパレータ番号1 :)

データベース構造

表車

cars_id | cars_category | cars_source | separator 
--------+---------------+---------------+----------- 
1  | 1   | 123.jpg  | 1 
2  | 1   | 242.jpg  | 1 
3  | 2   | 532.jpg  | 2 
4  | 2   | 531.jpg  | 3 
5  | 2   | 45fd.jpg  | 3 
6  | 3   | da3.jpg  | 4 

各カテゴリ

$cat1 = 1; 
$cat2 = 2; 
$cat3 = 3; 
$stmt = $dbCon->prepare(" INSERT INTO daily_versus (daily_versus_source, daily_versus_category) " 
     . " (SELECT cars_source, cars_category " 
     . " FROM cars " 
     . " WHERE cars_category IN (?) ORDER BY RAND() LIMIT 3) " 
     . " UNION " 
     . " (SELECT cars_source, cars_category " 
     . " FROM cars " 
     . " WHERE cars_category IN (?) ORDER BY RAND() LIMIT 3) " 
     . " UNION " 
     . " (SELECT cars_source, cars_category " 
     . " FROM cars " 
     . " WHERE cars_category IN (?) ORDER BY RAND() LIMIT 3) "); 
$stmt->bind_param('iii', $cat1, $cat2, $cat3); 
if ($stmt->execute()) { 
    echo "Success VERSUS/INSERT"; 
} else { 
    echo "Fail VERSUS/INSERT"; 
} 

から3枚のランダム画像魅力上記のような作品を選ぶが、何が賢いapproacだろう現在のPHPスクリプトに2つの同じ車を選ぶことはできないので、セパレータ番号 "x"を持つ自動車が選択された場合、その同じセパレータ番号を持つ別の車を選択することはできません。

答えて

-1

[seperator]でランク付けし、上位のものを選択します。

+0

これは、いずれかを持っていないはずです(使用する前に離れてコメント/ストリップを開始します)私が尋ねたものとの関係 – Javaish

0

最も簡単なのは、各クエリを区切り記号でグループ化することです。

... 
(SELECT cars_source, cars_category 
FROM cars 
WHERE cars_category IN (?) 
GROUP BY SEPARATOR 
ORDER BY RAND() LIMIT 3) 
... 

mysqlは各グループから「ランダム」な値をとります。 しかし、実際にはランダムではありません。セパレータグループごとに、そのセパレータが選択されるたびに1つ(常に同じもの)の値しか取られない可能性があります。

ベター -

... 
(SELECT cars_source, cars_category 
FROM 
(select 
    (select id  -- one random id, for each of the 3 random separators 
    from cars 
    where separator = ocars.separator -- will be a diff separator for each row in the outer query 
    order by rand() limit 1 
    ) as rand_id 
    from cars as ocars 
    WHERE cars_category IN (?) 
    group by separator -- each separator only once 
    order by rand()  -- random separators 
    limit 3    -- 3 random separators 
) as cars_id 
left join cars on cars.id = cars_id.rand_id -- join the full row for each rand_id 
) 
... 

あなたがIDに、インデックスを持つ、セパレータ上、 多分またカテゴリ

+0

あなたの答えは主にあなたが答えてくれたのですが、あなたのためにはっきりしていることが必要です;最初のコードリストはうまくいきません。 MySqlは 'order by rand'の前に' group by'を行います。したがって、一般的には(保証されていない)別個のセパレータごとに同じアイテムを返し、それらをシャッフルします。 あなたとOPが両方とも 'cars_category IN(?)'を好んだ理由について興味がありますが... –

+0

最初の "group by"は特別な場合に動作します。例えばテーブル内の物理的な順序が変更された場合。しかし、はい、「順序」は「セパレータ」にのみ影響し、同じ「セパレータ」のグループ内の項目には影響しません。 "in()"について、私はそれをコピーしました。 – Martin

+0

これは一見するとちょっと混乱しているようですが、これを分析して、これが私が探しているものかどうか確認しようと思います:) – Javaish

関連する問題