2017-10-01 6 views
0

これは、次の可能性があるかどうか、もしあれば、これにどう対処するかということです。同じIDの倍数でINNER JOINを使用してMYSQLからSELECT

他のテーブルのID値と等しいテーブルの複数のIDを選択するINNER JOINクエリを作成しました。

  1. 商品テーブル

    product_id | cults_id1 | cults_id2 | cults_id3 
    ----------------------------------------------------- 
        1  |  5  |  4  |  2 
        2  |  3  |  0  |  0 
    
  2. 品種テーブル

    cults_id | cults_name |  
    --------------------------- 
        1 | berries | 
        2 | fruit  | 
        3 | choc  | 
        4 | wood  | 
        5 | mysql!  | 
    

    は、だから私はそれをフェッチする場所に参加作成されたすべての製品のテーブルに基づいてcults_namecults_id1, cults_id2, cults_id3

    結果:

    Product_id(1) = mysql! , wood , fruit

    さて問題は、私は表示することができますどのように、次のいずれかが付属していますproduct_id(2)に含まれる1つの値。

    だから、このように見ていることになる:それはありません最初の後品種テーブルに似ているので、私のリストのこの瞬間product_id(2)文句を言わないディスプレイで

    Product_id(1) = mysql! , wood , fruit

    Product_id(2) = choc

    ID、(このクエリを使用)

    私は正規化を考慮する必要があります知っています。

    クエリ

    SELECT p.product_image_path, p.product_id, p.brand_name, p.product_name, b.botttle_size, v.vintage, 
        t.wine_type_blend, p.price, p.quantity, p.time_created, p.reference_number, p.shipping_cost, 
        c1.cultivar_type as cultivar_type1, c2.cultivar_type as cultivar_type2, 
        c3.cultivar_type as cultivar_type3, c4.cultivar_type as cultivar_type4 
        FROM product p 
        INNER JOIN wine_bottle b ON b.bottle_id = p.bottle_id 
        INNER JOIN wine_vintage v ON v.vintage_id = p.vintage_id 
        INNER JOIN wine_type t ON t.type_id = p.type_id 
        INNER JOIN wine_cultivar c1 ON c1.cultivar_id = p.cultivar_1_id 
        INNER JOIN wine_cultivar c2 ON c2.cultivar_id = p.cultivar_2_id 
        INNER JOIN wine_cultivar c3 ON c3.cultivar_id = p.cultivar_3_id 
        INNER JOIN wine_cultivar c4 ON c4.cultivar_id = p.cultivar_4_id 
    

    今私の製品リストページがリストに表示し、これは持っているが、私はcults_id1, cults_id2, cults_id30の価値を持っている場合でも、表示させたいです。

    製品-listing.php

    <?php 
         if($result = mysqli_query($conn, $query)){ 
         if(mysqli_num_rows($result) > 0){ 
         $i = 0;  
         while($row = mysqli_fetch_array($result)){ 
         $i++; 
    
         echo " 
         <p>Cultivars: <span>" .$row["cultivar_type1"]. "</span>, <span>" .$row["cultivar_type2"]. "</span>, <span>" .$row["cultivar_type3"]. "</span>, <span>" .$row["cultivar_type4"]. "</span></p> "; 
         } 
         mysqli_free_result($result); 
        } 
    
        } 
    

    出力:期待

    Product_id(1) = mysql! , wood , fruit 
    

    Product_id(1) = mysql! , wood , fruit 
    
        Product_id(2) = choc 
    
+0

これは私には貧しい構造のように見えます。もし4番目のカルトがあったら?正規化を考慮する必要があることが分かっている場合、なぜそれを考慮していないのですか? – Strawberry

+0

@Strawberry栽培品種は複数の選択肢から来ています.Wilは常に4または4未満です。また、 'cult_id_3'は' cult_id_2'に値がないので、 'cult_id_3'は決して値を持ちません。この小さなプロジェクトでは、ただ何かを達成しようとしていますが、今戻っていくと変化が起こります。私はこれをやり遂げるつもりだが、今のところこれを回避する方法を探している。 – Ylama

+0

今のところ、私はあなたのスキーマを再構築したいと思います。あなたはそれを後悔しません。 – Strawberry

答えて

0

ので、私はにするために必要な唯一のものはLEFT JOINを作成することでした。 LEFT JOINは0または値を受け入れることができるためです。そして、私の質問がうまくいった。

はいこれは私のmysql DBが正規化されていないためです。

ソリューション:

SELECT p.product_image_path, p.product_id, p.brand_name, p.product_name, b.botttle_size, v.vintage, 
    t.wine_type_blend, p.price, p.quantity, p.time_created, 
    p.reference_number, p.shipping_cost, 
    c1.cultivar_type as cultivar_type1, c2.cultivar_type as cultivar_type2, 
    c3.cultivar_type as cultivar_type3, c4.cultivar_type as cultivar_type4 
FROM product p 
    INNER JOIN wine_bottle b ON b.bottle_id = p.bottle_id 
    INNER JOIN wine_vintage v ON v.vintage_id = p.vintage_id 
    INNER JOIN wine_type t ON t.type_id = p.type_id 
    LEFT JOIN wine_cultivar c1 ON c1.cultivar_id = p.cultivar_1_id 
    LEFT JOIN wine_cultivar c2 ON c2.cultivar_id = p.cultivar_2_id 
    LEFT JOIN wine_cultivar c3 ON c3.cultivar_id = p.cultivar_3_id 
    LEFT JOIN wine_cultivar c4 ON c4.cultivar_id = p.cultivar_4_id 
関連する問題