0

こんにちは、mysql でネストされた「select」クエリを実行しています。クエリは

SELECT `btitle` FROM `backlog` WHERE `bid` in (SELECT  `abacklog_id`  FROM `asprint` WHERE `aid`=184 )

上記のクエリで期待される回答が得られません。私が実行した場合:

どこからでも選択 = abacklog_id 184asprintaid

別々に

abacklog_id を42,43,44,45;として取得します。

したがって、もう一度実行すると:

SELECT `btitle` FROM `backlog` WHERE `bid` in(42,43,44,45)

btitleを次のように取得します scrum1 scrum2 scrum3 msoffice

しかし、これらのクエリを組み合わせると、scrum1残りの 3 つしか得atitleられません。

4

2 に答える 2

0

あなたがしたことは、コンマ区切りの値を に格納することですage_sprint.as_backlog_idよね?

あなたのクエリは実際に

SELECT `ab_title` FROM `age_backlog` WHERE `ab_id` IN ('42,43,44,45')

'関数内の に注意してくださいIN()。個別の数字は取得せず、1 つの文字列を取得します。

今、あなたがするとき

SELECT CAST('42,43,44,45' AS SIGNED) 

これは基本的に MySQL が行う暗黙のキャストであり、結果は42. そのためscrum1、結果として得られます。

SO では、この問題に対する多数の回答を検索できます。

コンマ区切りの値をデータベースに保存しないでください。これは第 1 正規形に違反しています。ほとんどの場合、データベースは第 3 正規形または BCNF またはそれ以上です。低正規形は、通常は問題を報告するために、最大のパフォーマンスを得るためにいくつかの特別なケースでのみ使用されます。実際にデータを操作するためのものではありません。ごとに 1 行が必要ですas_backlog_id

繰り返しますが、あなたの主な目標は、より良いデータベース設計を得ることであり、コンマで区切られた各数値をフィールドから取得するクレイジーな関数を作成することではありません。

于 2013-05-16T13:46:31.313 に答える
0

次のように試すことができます...

SELECT `age_backlog`.`ab_title` FROM `age_backlog` LEFT JOIN `age_sprint` ON `age_backlog`.`ab_id` = `age_sprint`.`as_backlog_id` WHERE `age_sprint`.`as_id` = 184

このクエリを使用すると、 loop で結果が得られます。IMPLODE関数を使用すると、コンマで区切られた場所で同じ場所ですべての結果を取得できます..

お役に立てば幸いです...エラーが発生した場合はお知らせください...

于 2013-05-16T12:34:51.823 に答える