0

次のようなMySQLテーブルがあります

id    |  text   |  category   |   active

でランダムな行を選択します

SELECT id, text 
FROM table
WHERE category = [category id] AND active = 1 
ORDER BY RAND()
LIMIT 1

場合によっては、結果が返されないことがあります (たとえば、特定のカテゴリにアクティブな行がない場合)。その場合に必要なことは、「デフォルト」行を返すことです。

私の質問は、これを行う最も効率的な方法は何ですか? 上記のクエリで結果が得られない場合は、同じテーブルを作成する必要がありますが、デフォルトの行だけを使用してクエリを実行する必要がありますか? または、同じテーブルにデフォルトの行を追加する必要がありますか? そして、どのようにそれを照会しますか?

どんな提案でも大歓迎です!

編集 質問に対するいくつかの更新:

  1. コードを変更せずにカスタマイズできるようにしたいので、PHP でデフォルトのテキストを生成する可能性を除外しています。

  2. カテゴリごとにデフォルトの行があります

4

4 に答える 4

3
SELECT id, text 
FROM table
WHERE (category = [category id] AND active = 1 ) 
    OR ((DEFAULT CONDITION) AND NOT((category = [category id] AND active = 1 )))
ORDER BY RAND()
LIMIT 1
于 2012-04-11T07:15:06.737 に答える
2

あなたが望むデフォルト値は何ですか?テーブルの最初のID?

SELECT id, text
FROM (  SELECT id, categori, active, text, 0 AS prio
        FROM table WHERE category = [category id] AND active = 1 
        UNION ALL
        SELECT id, categori, active, text, 1
        FROM table
        ORDER BY id ASC
        LIMIT 1) AS h
ORDER BY prio, RAND()
LIMIT 1

特定のデフォルト値が必要な場合は、次の ENUM 列を追加しますdefault('TRUE', 'FALSE')

SELECT id, text
FROM (  SELECT id, categori, active, text, 0 AS prio
        FROM table WHERE category = [category id] AND active = 1 AND default = 'FALSE'
        UNION ALL
        SELECT id, categori, active, text, 1
        FROM table
        WHERE category = [category id] AND default = 'TRUE'
        ORDER BY id ASC
        LIMIT 1) AS h
ORDER BY prio, RAND()
LIMIT 1

簡単なもの:

SELECT id, text
FROM table
WHERE category = [category id] AND (active = 1 OR default = 'TRUE')
ORDER BY (default = 'FALSE') DESC, RAND()
LIMIT 1

説明:
基本的に、このクエリは、取得する必要のあるすべての行をフェッチし、それをデフォルトの行と結合します。それらはそれぞれプリオ値を取得し、実行する前にそれらを注文しますRAND()。あとは、デフォルトの行をどのように保存するかです。

于 2012-04-11T07:14:33.167 に答える
0

使用している言語によっては、返された行数を確認できます。

// php

$res = mysql_query("...");

if( mysql_num_rows($res) < 1 )
{
  // no result
}
else
{
  // do something
}
于 2012-04-11T07:13:36.430 に答える
0

「デフォルト行」とはどういう意味ですか? あなたの言いたいことが理解できるかどうか、よくわかりません。しかし、結果がなくても何かを出力したいという場合は、プログラムでそれを行うだけです。

データを含む結果セットがあるかどうかを確認してください。そうでない場合は、スクリプトを介して何かを出力します。

于 2012-04-11T07:13:00.530 に答える