2017-01-31 13 views
-4

私は 'ウィジェット'のレコードを含むテーブルを持っていますが、多くの列は異なるテーブルのレコードのIDだけを含んでいます。ウィジェットレコードを編集するときに、ユーザーは不完全であっても保存を行うことができます。彼らは後でそれを開き、続けることができます。 私が持っている問題は、where句にデフォルト値0があり、他のテーブルに一致するフィールドがないため、クエリが何も返されないときに不完全なときです。ここにこの問題を示すスクリプトのサンプルがあります。動的に作成されたSQLはうまくいきません

select Client,Make,Model,Shape 
from 
widget,clients,makes,models,shapes 
where 
widget.ClientId = '3' and 
widget.MakeId = makes.Id and 
widget.ModelId = models.Id and 
widget.ShapeId = shapes.Id 

私はPHPを使用してこのクエリを動的に構築していますので、できるだけシンプルにしています。すべてのsugestions歓迎、ありがとう。

+1

あなたは 'JOIN'ステートメントを使用する必要が私見:widget表があなたのメインテーブルであるので、それが不完全であってもウィジェットを取得するためにwidget上の他のすべてのテーブルを結合するためにleft joinを使用して、あなたの説明に基づいて

そのようなあなたのテーブルを集めることができるようにする。 –

+3

これは、SQL入門ガイドで回答できる基本的な質問です。 – Strawberry

+1

@Strawberry、私は知らない...クエリーの幸福と幸福は技術文献で十分に扱われていない。 – yivi

答えて

0

問題はあなたがwhereに参加かという暗黙のinner join(暗黙の意味を使用していることで異なっている場合、私は間違っている可能性があります句)。内部ジョインは一致するレコードのみを返します。したがって、データの一部が不完全な場合、レコードは返されません。

代わりに、結合のテーブルの1つからのすべてのレコードと、他のテーブルの一致するレコードを返します(MySQLは完全外部結合をサポートしていませんが、ここには関係ありません)。

select c.Client, m.make, md.model, s.shape 
from widget w 
left join clients c on c.id = w.ClientId 
left join makes m on m.id = w.MakeId 
left join models md on md.id = w.ModelId 
left join shapes s on s.id = w.ShapeId 
+0

ありがとうございます。私はオリジナルを試してみましたが、左にはいません:( – Dave

-1
select c.Client, m.make, md.model, s.shape 
from widget w 
join clients c on c.id = w.ClientId 
join makes m on m.id = w.MakeId 
join models md on md.id = w.ModelId 
join shapes s on s.id = w.ShapeId 

FROM句に複数の表の代わりに結合を使用します。

+0

単純な内部結合は行いません(MySQL結合は内部結合と同じです)。 – Shadow

+0

OKと記載されています。ありがとう –

-1

代わりの直接他のテーブルからのレコードが存在する場合に関係なくなるように使用LEFT JOINに参加し、まだ最初のテーブルのエントリが返されます:表の列が下ケース

にする必要があります

SELECT Client, Make, Model, Shape 
FROM widget 
LEFT JOIN clients ON widget.ClientId = widget.Id 
LEFT JOIN makes ON widget.MakeId = makes.Id 
LEFT JOIN models ON widget.ModelId = models.Id 
LEFT JOIN shapes ON widget.ShapeId = shapes.Id 
WHERE widget.ClientId = 3 


テーブル名は、単数形である必要があります。 modelshape


外部キーは、他のテーブルにする必要があります。代わりにwidgetModelIdを有するので、modelwidget IDを持っている必要があり

関係が

+0

"外部キーは他のテーブルにあるはずです。" ?単一のウィジェットは、多くのモデルの1つになる可能性があります。これは、モデルテーブルのモデル記述を参照します。 IDはフォームのドロップダウンリストから来ます – Dave

関連する問題