0

これは以前に何度も尋ねられたことは知っていますが、自分に近い答えを見つけることができません。

次のクエリがあります。

SELECT c.cases_ID, c.cases_status, c.cases_title, ci.custinfo_FName, ci.custinfo_LName, c.cases_timestamp, o.organisation_name 
FROM db_cases c, db_custinfo ci, db_organisation o 
WHERE c.userInfo_ID = ci.userinfo_ID AND c.cases_status = '2' 
AND organisation_name = (
    SELECT organisation_name 
    FROM db_sites s, db_cases c 
    WHERE organisation_ID = '111'
)
AND s.sites_site_ID = c.sites_site_ID)

私がやろうとしているのは、ケースで定義されているsites_site_IDが、「organisation_ID = '111'」で定義されているようにフィルタリングしたいorganisation_IDと一緒にdb_sitesサイトテーブルにも表示されるケースを取得することですが、質問に記載されているように、MySQL から応答を得ています。

これが理にかなっていることを願っています。これについて何か助けていただければ幸いです。

ありがとう。

4

4 に答える 4

0

エラーが示すように、サブクエリはこの状況では実行できない複数の行を返します。これが予期しない結果である場合は、なぜこれが発生するのかを調査する必要があります。ただし、これが発生することがわかっていて、最初の結果のみを使用LIMIT 1して、結果を 1 行に制限する場合。

SELECT organisation_name 
FROM db_sites s, db_cases c 
WHERE organisation_ID = '111'
LIMIT 1
于 2013-11-13T03:12:52.097 に答える
0

問題は、明らかに、WHERE 句の = 演算子などを使用してスカラー サブクエリとして使用すると、サブクエリが無効な複数の行を返すことです。

代わりに、サブクエリで内部結合を実行して、結果を ON 句に一致する行のみにフィルター処理することができます。これにより、サブクエリで複数の行が返された場合でも、一致するすべての行が取得されます。

更新: db_sites および db_cases テーブルでクロス結合を行っているため、サブクエリから複数の行を取得している可能性があります。古いスタイルの結合構文を使用しており、WHERE 句でテーブルを結合する述語を修飾していません。この古いスタイルのテーブル結合を使用することは、まさにこの理由からお勧めできません。どのような種類の結合で、どのようにテーブルを結合するかを明示した方がよいでしょう。

結合に関する優れたページ: http://dev.mysql.com/doc/refman/5.0/en/join.html (正しい構文について) http://www.codinghorror.com/blog/2007/10/a- visual-explanation-of-sql-joins.html (結合の種類の違いについて)

于 2013-11-13T03:15:32.907 に答える
0

私はこれと 1 時間戦っていましたが、完全に複雑になりすぎました。ちょっと休憩してオンライン フォーラムに書き出すだけで解決することもあります ;)

これが本来あるべきクエリです。

SELECT c.cases_ID, c.cases_status, c.cases_title, ci.custinfo_FName, ci.custinfo_LName, c.cases_timestamp, c.sites_site_ID 
FROM db_cases c, db_custinfo ci, db_sites s 
WHERE c.userInfo_ID = ci.userinfo_ID AND c.cases_status = '2' AND (s.organisation_ID = '111' AND s.sites_site_ID = c.sites_site_ID)
于 2013-11-13T03:16:36.100 に答える