0

テーブルに入力するために特定の方法でデータを返す必要がある特別なデータ環境があります。

これは私の現在のクエリです:

SELECT 
  bs_id, 
  IF(bs_board = 0, 'All Boards', (SELECT b_name FROM certboards WHERE b_id IN (REPLACE(bs_board, ';', ',')))) AS board 
FROM boardsubs

ご覧のとおり、ifステートメントと特別なサブセレクトがあります。

私がこれを持っている理由bs_boardは、フィールドが次のvarcharように複数の行 ID を含むフィールドであるためです。

1;2;6;17

したがって、クエリは正常に機能しますが、最初に一致したb_name. すべての一致を返す必要があります。たとえば、これは1;22 つのボードBoard 1Board 2同じ列に返す必要があります。<br>後で、各結果の間にa を追加することに対処できます。

しかし、私が扱っている問題は、フィールドには選択した元のエディターと同じ数の名前を含めることができるため、両方の名前またはすべての名前を単一の列に戻す必要があることです。

4

2 に答える 2

1

これは、あなたが考えているようには機能しません。

bs_boardとしましょう'1;2;3'

クエリでは、単一のリテラル文字列であるREPLACE(bs_board, ';', ',')に解決されます。'1,2,3'これにより、最終的なサブクエリが作成されます。

SELECT b_name FROM certboards WHERE b_id IN ('1,2,3')

これは次と同等です:

SELECT b_name FROM certboards WHERE b_id = '1,2,3'

この問題に対する最も正しい解決策は、データベースを正規化することです。現在のシステムや 1 つのフィールドに複数の値を格納することは、まさに RDBMS で行うべきではありません。これがまさにその理由です。データベースは、この種のフィールドを処理するようには設計されていません。それぞれに 1 つの行を含む個別のテーブルを作成し、次にテーブルを作成する必要があります。bs_boardJOIN

この問題に対する適切な解決策はありません。これは、スキーマ設計の基本的な欠陥です。これを回避する最も簡単な方法は、アプリケーション ロジックで修正することです。最初に実行します:

SELECT bs_id, bs_board FROM boardsubs

そこからbs_board、アプリケーション ロジックでフィールドを解析し、実行する実際のクエリを作成します。

SELECT bs_id, 
  IF(bs_board = 0, 'All Boards', (SELECT b_name FROM certboards WHERE b_id IN (<InsertedStringHere>) AS board 
FROM boardsubs

この問題を回避する方法は他にもありますが、並べ替え順序、一致、およびその他の多くの問題に問題があります。最善の解決策は、テーブルを追加し、この多値フィールドをそのテーブルに移動することです。

于 2013-01-23T22:01:14.797 に答える
1

b_id IN (REPLACE(bs_board, ';', ','))どちらがあなたが探しているものとはb_id IN ('1,2,6,7')異なります。b_id IN (1,2,6,7)

機能させるには、クエリを実行する前に文字列を解析するか、準備されたステートメントを使用します。

于 2013-01-23T21:37:05.873 に答える