2011-11-16 14 views
0

私はそこにあると知っている結果を得ようとしていますが、ちょうどクエリの権利を取得するように見えることができません。私は、次を使用しています:ちょうどmysqlのクエリを正しく得ることができない

SELECT 
    * 
FROM 
    carpets AS c 
    INNER JOIN carpet_relations AS r ON c.id = r.carpet_id 
WHERE 
    c.active = '1' 
    AND **((r.relation_type = '5') 
    AND (r.related_id = '1'))** 
    *AND* ((r.relation_type = '4') 
    AND (r.related_id = '1')) 
    AND (c.width_feet BETWEEN '0' AND '17') 
    AND (c.width_inches BETWEEN '0' AND '11') 
    AND (c.height_feet BETWEEN '0' AND '29') 
    AND (c.height_inches BETWEEN '0' AND '11') 
ORDER BY 
    c.item_no 

を私は変更しているが、あるいは私のイタリック体である場合は、私は2番目のテーブルに2つの一致するフィールドを持つGET結果をしようとしています見ることができるような結果を得るが、それは結果であります関係タイプ5を持っており、4

が関連することを心に留めておく

リスト:私は、設定前に、どのようにそれはようなものになるだろう

太字であるとしている結果を必要とする両方のためのidは3つのcolu MSのcarpet_id、related_id、relation_type任意の助け

おかげ

c_categories 列型NULLデフォルトコメント ID int型(11)いいえ
タイトルVARCHAR(250)いいえ
アクティブint型(11)いいえ
重量はint(11)いいえ
TEMPLATE_ID int型ません(11)いいえ

c_sizes 列型NULLデフォルトコメント ID int型(11)N O
タイトルVARCHAR(250)いいえ
アクティブint型(11)いいえ
重量INT(11)いいえ
TEMPLATE_ID int型(11)いいえ

carpet_relations

列型NULLデフォルトコメント

carpet_id int(11)No < ------は、関係がどのカーペットであるかを示します。

related_id int(11)いいえ< ------

relation_typeはint(11)を使用するC_SIZE又はc_categoriesの番号< ------が意味表c_sizes又はc_categoriesいずれか

+0

はあなたがタイプ5 OR 4を意味していますか? – Chris

+0

ちょうどそれが理解されていることを確認する5関係がカテゴリーのものであり、1がそれがカテゴリー1であり、4がテンプレートと1の関係テンプレート1だと言っています..........私はデータベースを書いたり設計したりしませんでしたが、それに対処しなければなりません。 –

+0

検索を絞り込んで、カテゴリ1を選択する必要があります。メインとし、それをカテゴリー2で絞り込んでください。そうすれば、より少ない結果ではなく、より多くの結果がもたらされます。 –

答えて

0

は、今私が思うには、私はあなたの問題を理解 - あなたはこれがあなたのようにPHPで行うことができる4.

タイプ5とタイプの結果の交差後にしています2つのクエリを実行し、それらを交差させて言及し、またはあなたがそうのように二回にcarpet_relationsテーブルに参加してMySQLでこれを行うことができます。

SELECT 
    * 
FROM 
    carpets AS c 
    INNER JOIN carpet_relations AS r1 ON c.id = r1.carpet_id 
    INNER JOIN carpet_relations AS r2 ON c.id = r2.carpet_id 
WHERE 
    c.active = '1' 
    AND (r1.relation_type = '5') 
    AND (r1.related_id = '1') 
    AND (r2.relation_type = '4') 
    AND (r2.related_id = '1') 
    AND (c.width_feet BETWEEN '0' AND '17') 
    AND (c.width_inches BETWEEN '0' AND '11') 
    AND (c.height_feet BETWEEN '0' AND '29') 
    AND (c.height_inches BETWEEN '0' AND '11') 
ORDER BY 
    c.item_no 
+0

トリックをしました.....あなたはすっごく見ています。私はそれを見て、あなたがジョインとして何をしているのか理解する必要があります。この複合体をクエリするのも新しいです。私は通常、結合がないより単純なものを行いますが、これは素晴らしいです! –

+0

喜んでそれはあなたのために働く。基本的には、carpet_relationsテーブルを2回、relation_typeが5のカーペットを取得するために1回、relation_typeが4の別の時間に参加させる必要があります。relation_typeのような別の制約を追加する場合は、 carpet_relationsテーブルを再度オンにします。がんばろう。 – Chris

+0

ああ、これが正解だと思ったら受け入れをクリックしてください;) – Chris

2

変更この:

これに

((r.relation_type = '5') AND (r.related_id = '1')) AND ((r.relation_type = '4') AND (r.related_id = '1'))

(r.relation_type = '5' OR r.relation_type = '4') AND (r.related_id = '1')

+0

それが必要(5と1)と(4と1) –

+0

@UgurGumushanが指摘したように、 'r.relation_type'は同時に4 *と* 5にすることはできません。 – kol

0
AND ((r.relation_type = '5') 
AND ((r.relation_type = '4') 

あなたは関係タイプが同時に5と4であると予想しています。

あなたのサラダに「または」の部分がありますか?

編集:

SELECT 
    * 
FROM 
    carpets AS c 
    INNER JOIN carpet_relations AS r ON c.id = r.carpet_id 
WHERE 
    c.active = '1' 
    AND 
((r.relation_type = '5') AND (r.related_id = '1')) 
    OR 
((r.relation_type = '4') AND (r.related_id = '1')) 

    AND (c.width_feet BETWEEN '0' AND '17') 
    AND (c.width_inches BETWEEN '0' AND '11') 
    AND (c.height_feet BETWEEN '0' AND '29') 
    AND (c.height_inches BETWEEN '0' AND '11') 
ORDER BY 
    c.item_no 

はあなたの問題を解決します。柔軟性の便宜上

+0

テーブルと5は、関係idとカテゴリーidとの関係を表し、4は、関係idとのテンプレート関係を表します。なぜなら、私は両方が必要なテンプレートIDです。 –

+0

私はそれを試してみました。だから、ユーザーが長い敷物のことを言うと全体的なカテゴリであるので、彼らはそれを狭くして東洋の敷物にしたいと思うのですが、私は長い敷物と東洋の両方の完全なリストを望んでいません長い敷物である東洋の敷物 –

1

r.relation_type IN (4, 5) 
+0

+1 Nice'n'brief(TM) – kol

関連する問題