2011-01-01 1 views
2

私は注文を取得するクエリを書いています(これはeコマースタイプのサイト用です)、その注文IDからすべての注文アイテム(ecom_order_items)、印刷オプション(c_print_options)、イメージ)。 eoi_p_idは現在、イメージテーブルの外部キーです。4テーブルクエリ/ジョイン。重複する行を取得する

これは正常に動作し、クエリは次のとおりです。

SELECT 
eoi_parentid, eoi_p_id, eoi_po_id, eoi_quantity, 
i_id, i_parentid, 
po_name, po_price 
FROM ecom_order_items, images, c_print_options WHERE eoi_parentid = '1' AND i_id = eoi_p_id AND po_id = eoi_po_id;

上記の私は、余分なテーブルを追加したもの(ecom_products)を複雑に今私が注文#1

のために必要なすべてのものをつかむだろう、画像テーブルと同様に動作する必要があります。 eoi_p_idは、このテーブルの外部キーも指すことができます。私は余分なフィールド 'eoi_type'を追加しました。このフィールドには 'image'という値か 'product'という値があります。

今すぐ注文のアイテムは、画像またはecom_productsのアイテムを組み合わせて構成することができます。私が試してみると、あまりにも多くのレコードで終わってしまい、eoi_type = 'product'で実際に出力することはありません。どのように私は後になって達成するための任意のアイデアですか?必要に応じてSQLサンプルを提供できますか?

 
SELECT 
eoi_id, eoi_parentid, eoi_p_id, eoi_po_id, eoi_po_id_2, eoi_quantity, eoi_type, 
i_id, i_parentid, 
po_name, po_price, po_id, 
ep_id 
FROM ecom_order_items, images, c_print_options, ecom_products WHERE eoi_parentid = '9' AND i_id = eoi_p_id AND po_id = eoi_po_id

上記の出力結果は重複しており、期待どおりに動作しません。私はこれについて間違った方法をとっていますか? eoi_p_idの外部キーフィールドは、イメージや製品に応じて別々にする必要がありますか?

私はJOINを使用すべきですか?ここで

は、MySQLがどこにあるか、FROM句のいずれかecom_productsの結合条件を逃している質問

 
ecom_products 

+-------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+-------------+--------------+------+-----+---------+----------------+ 
| ep_id  | int(8)  | NO | PRI | NULL | auto_increment | 
| ep_title | varchar(255) | NO |  | NULL |    | 
| ep_link  | text   | NO |  | NULL |    | 
| ep_desc  | text   | NO |  | NULL |    | 
| ep_imgdrop | text   | NO |  | NULL |    | 
| ep_price | decimal(6,2) | NO |  | NULL |    | 
| ep_category | varchar(255) | NO |  | NULL |    | 
| ep_hide  | tinyint(1) | NO |  | 0  |    | 
| ep_featured | tinyint(1) | NO |  | 0  |    | 
+-------------+--------------+------+-----+---------+----------------+ 

ecom_order_items 

+--------------+-------------+------+-----+---------+----------------+ 
| Field  | Type  | Null | Key | Default | Extra   | 
+--------------+-------------+------+-----+---------+----------------+ 
| eoi_id  | int(8)  | NO | PRI | NULL | auto_increment | 
| eoi_parentid | int(8)  | NO |  | NULL |    | 
| eoi_type  | varchar(32) | NO |  | NULL |    | 
| eoi_p_id  | int(8)  | NO |  | NULL |    | 
| eoi_po_id | int(8)  | NO |  | NULL |    | 
| eoi_quantity | int(4)  | NO |  | NULL |    | 
+--------------+-------------+------+-----+---------+----------------+ 

c_print_options 

+------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+------------+--------------+------+-----+---------+----------------+ 
| po_id  | int(8)  | NO | PRI | NULL | auto_increment | 
| po_name | varchar(255) | NO |  | NULL |    | 
| po_price | decimal(6,2) | NO |  | NULL |    | 
+------------+--------------+------+-----+---------+----------------+ 

images 

+--------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+--------------+------+-----+---------+----------------+ 
| i_id   | int(8)  | NO | PRI | NULL | auto_increment | 
| i_filename | varchar(255) | NO |  | NULL |    | 
| i_data  | longtext  | NO |  | NULL |    | 
| i_parentid | int(8)  | NO |  | NULL |    | 
+--------------+--------------+------+-----+---------+----------------+ 

答えて

1

これは最初のクエリを書く方法です。私は、結合を使用することを好む。

SELECT eoi_parentid, eoi_p_id, eoi_po_id, eoi_quantity, i_id, i_parentid, po_name, po_price 
FROM ecom_order_items 
INNER JOIN images 
    ON i_id = eoi_p_id 
INNER JOIN c_print_options 
    ON po_id = eoi_po_id 
WHERE eoi_parentid = '1' 

2回目のクエリでは、イメージ用と製品用の2つのクエリでUNIONを使用します。

SELECT eoi_id, eoi_parentid, eoi_p_id, eoi_po_id, eoi_po_id_2, eoi_quantity, eoi_type, i_id, i_parentid, po_name, po_price, po_id, ep_id 
FROM ecom_order_items 
INNER JOIN images 
    ON i_id = eoi_p_id 
INNER JOIN c_print_options 
    ON po_id = eoi_po_id 
WHERE eoi_type = 'image' AND i_id = eoi_p_id --Image conditions 
    AND eoi_parentid = '9' 
    AND po_id = eoi_po_id 

UNION 

SELECT eoi_id, eoi_parentid, eoi_p_id, eoi_po_id, eoi_po_id_2, eoi_quantity, eoi_type, i_id, i_parentid, po_name, po_price, po_id, ep_id 
FROM ecom_order_items 
INNER JOIN images 
    ON i_id = eoi_p_id 
INNER JOIN c_print_options 
    ON po_id = eoi_po_id 
WHERE eoi_type = 'product' AND ep_id = eoi_p_id -- Product conditions 
    AND eoi_parentid = '9' 
    AND po_id = eoi_po_id 
+0

この種の作品ですが、ユニオンの底部は0行を返します。これは、その製品の場合、それは何も印刷オプションを持っていないし、下部のクエリからそれを削除することは、トップ1に影響を与えているなど、選択された列は一致する必要があります – Horse

+0

Yay!私はそれを働かせ、2番目のクエリの印刷オプションビットに左結合が必要になった。ありがとう! – Horse

+0

うれしかったです。私はソファに座っていただけで、選択リストの列が正しく一致しない可能性があることに気付きました。別の注記では、「別のキーフィールドを別にする必要がありますか?」と尋ねました。画像と商品には共通点がないようです。 2つのFKだけを持つことができるときに、なぜタイプフィールドとの関係が複雑になるのですか? – mikesigs

2

内のテーブルの説明です。これは、それがANSI-92を使用して行わ加入

SELECT 
    eoi_id, 
    eoi_parentid, 
    eoi_p_id, 
    eoi_po_id, 
    eoi_po_id_2, 
    eoi_quantity, 
    eoi_type, 
    i_id, 
    i_parentid, 
    po_name, 
    po_price, 
    po_id, 
    ep_id 
FROM 
    ecom_order_items, 
    LEFT JOIN images 
    ON i_id = eoi_p_id 
    LEFT JOIN c_print_options 
    ON po_id = eoi_po_id 
    INNER JOIN ecom_products 
    ON eoi_p_id = ep_id 
WHERE 
    eoi_parentid = '9' 

ANSI 92が好ましく、ジョインとされる方法で、その参加し、フィルタリングは何だなけなしの明確。あなたはちょうどAND eoi_p_id = ep_idをwhere節に追加することができます。

+0

二重目的の外部キーの追加の問題があります。 ON句でこれを考慮する必要があります。または、私が持っているようにUNIONを使用する必要があります。 – mikesigs

+0

これは0行を返します。これはwhatispunkの下の投稿と同じ理由によるものと思われます。印刷オプションに潜在的な結果がないようにする必要があります。 – Horse

+0

印刷オプションがない可能性がある場合は、それを左にするだけです。UNIONは過剰です。 –

関連する問題