2

SELECT クエリの値をチェックする関数を mySQL 内に記述し、それが != 0 の場合、関数の実行を続行して結果配列に追加することは可能ですか?

related_id=としてマークされたエントリがいくつかあります0 。残りには実際の正の数値が添付されています。

SQL関数を継続的にループする単一のクエリを作成しようとしています。取得したrelated_id結果が0であるかどうかを確認して確認します。そうでない場合は、再度実行され、新しくチェックされた行が結果配列に追加され、見つかるまで続行されます0。

DB のセットアップ方法では、常に 0 が発生し、id を介して検索されるため、結果は 1 つだけになります。

少し変更されたタグ付けシステムを使用しています。

keywords_id | keyword  | related_id
------------------------------------
1           | sports   | 0
2           | baseball | 1
3           | football | 1
4           | pitchers | 2

related_id=を渡すと、次2のような配列が返されます。

array 
[0]
   keyword => 'sports'
   keywords_id => '1'
   related_id => '0'
[1]
   keyword => 'baseball'
   keywords_id => '2'
   related_id => '1'
[2]
   keyword => 'pitcher'
   keywords_id => '4'
   related_id => '2'

私は IF と THEN を使って運を試しましたが、十分な例を見たことがなく、オンラインで堅実なチュートリアルを見つけるのは難しいです。ありがとう!

SELECT k.* 
FROM keywords k
WHERE keywords_id = 2

上記のクエリは、本質的にそれを開始します。は渡されたものですkeywords_idrelated_idしたがって、上記は戻りますkeywords_id: 2 |keyword: baseball |related_id: 1

related_id 1 は 0 ではないため、もう一度実行する必要があります。

これは、いくつかの追加のクエリを使用して PHP で実行できることを認識しています...それは私がこれを行うべき方法ですか? 関数について読んだ後、mySQLで実行できると思います。私はそれを理解できませんでした。

4

2 に答える 2

1

MySQLは、関数から配列を返すことをサポートしていません。結果を保持するテーブル(または場合によっては一時テーブル)を作成し、代わりにストアドプロシージャを記述してデータを入力することをお勧めします。

あなたが何を達成しようとしているのか正確にはわかりませんが、おそらくこれに沿った何かですか?

CREATE TABLE results (keywords_id INT, keyword VARCHAR(2000), related_id INT);

CREATE PROCEDURE populateResults(IN keyword_id_in INT)
BEGIN
  DECLARE num_results INT;
  DECLARE max_results INT;
  DECLARE next_keyword_id INT;
  SET next_keyword_id = keyword_id_in;
  SET max_results = 5;
  SET num_results = 0;

  DELETE FROM results;

  the_loop: LOOP
    INSERT INTO results
    SELECT keywords_id, keyword, related_id
    FROM keywords
    WHERE keywords_id = next_keyword_id;

    SELECT related_id
    FROM keywords
    WHERE keywords_id = next_keyword_id
    INTO next_keyword_id;

    IF (next_keyword_id = 0) || (num_results >= max_results) THEN
      LEAVE the_loop;
    END IF;
    SET num_results = num_results + 1;
  END LOOP the_loop;
END

SQLFiddleデモを参照してください

于 2013-01-22T22:20:55.060 に答える
1

上記のサンプルからの私の理解 - 一致が見つかるまですべてのレコードをチェックする必要があります (上記の related_id = 2 のサンプル)。

その場合は、mysql カーソルhttp://dev.mysql.com/doc/refman/5.0/en/cursors.htmlを使用 して、結果セットをループすることができます。

于 2013-01-22T21:36:07.737 に答える