2011-09-20 6 views
5

OKデータベース: これが参考にされているが、私が現在働いている何のために働いていないMySQL GROUP BY two columnsとき、クエリ私は今、数日間辺りで見ている、と私はこれを見つけた

quantity_id int(11) auto_increment not null (primary key) 
product_id int(11) not null 
color_id int(11) not null 
size_id int (11) not null 
quantity int (11) not null 

表2(色)から成る:

color_id int(11) auto_increment not null (primary key) 
color_name varchar(255) 

ので、ここ

は、私は3つの異なるテーブル

表1(量)で構成を有しているものの範囲であります表3(サイズ)で構成:

size_id int (11) auto_increment not null (primary key) 
size varchar(255) 

SELECT s.size, c.color_name, q.quantity, q.size_id, q.product_id, q.color_id 
FROM quantities q, colors c, sizes s 
WHERE q.color_id = c.color_id 
AND q.size_id = s.size_id 
AND q.product_id = $pid 
GROUP BY q.color_id 
ORDER BY q.size_id 

$ pidは、フォームが渡す製品IDです。

私は2つの異なるselect文に結果をロードすると:色の1、サイズ のための1つ、私は同じ色やサイズの倍数を得る:

red    s 
red    L 
yellow   L 

私はそれが文字通り出て行を引っ張っていることを理解しどのように私は自分自身を繰り返さないのですか?

私は

SELECT s.size, c.color_name, q.quantity, q.size_id, q.product_id, q.color_id 
FROM quantities q LEFT JOIN colors c ON q.color_id = c.color_id 
LEFT JOIN sizes s ON q.size_id = s.size_id 
WHERE q.product_id = $pid 

がより良い方法はありますこのクエリを試してみましたか?

+1

何を達成しようとしているのですか? – Einacio

+0

これは役に立ちます。 ここでゲームを終了します。1個以上の数量の商品をセレクトボックスに追加したいだけです。 「赤」、「青」、または「青」の複数の色を表示したくないなど 今のようには 赤L 赤S 黄色L ブルーS – alexis

答えて

0

あなたの質問は少し不明ですが、以下のクエリでは、ジョインを使用して製品IDを指定すると、色、サイズ、および数量の情報が得られます。

あなたは色や大きさのすべての組み合わせを取得しているので、あなたが繰り返し行を取得している数量制約と

SELECT size, color_name, quantity, sizes.size_id, colors.color_id 
FROM quantities 
    INNER JOIN colors ON quantities.color_id = colors.color_id 
    INNER JOIN sizes ON quantities.size_id = sizes.size_id 
WHERE product_id = ? and quantity > 1 
+0

これは、複数の色、サイズの移入からの私の選択を維持します表示することができ、複数のサイズの「S」、「L」を表示するには?ブルー、グリーン、レッドが一度、S M Lが一度表示されます。 – alexis

+0

はい。数量表にそれらのキーを格納するので、色とサイズの両方に対して1対1マッチングが実装されています。これは、特定の製品IDに対して単一の色と単一のサイズのみを取得します。 –

+0

あなたの助けをありがとう – alexis

0

を更新しました。私は同じサイズのためにいくつかの色があると想像しています。これは普通です。整合性を強制する場合は、内部結合の結合を変更して、一致するレコードのみを取得するようにします。

SELECT s.size, c.color_name, q.quantity, q.size_id, q.product_id, q.color_id 
FROM quantities q INNER JOIN colors c ON q.color_id = c.color_id 
INNER JOIN sizes s ON q.size_id = s.size_id 
WHERE q.product_id = $pid 

UPDATE:あなたも一色のみとワンサイズと、すべての数量の合計を表示したい場合は

SELECT s.size, c.color_name, q.quantity, q.size_id, q.product_id, q.color_id 
FROM quantities q INNER JOIN colors c ON q.color_id = c.color_id 
INNER JOIN sizes s ON q.size_id = s.size_id 
WHERE q.product_id = $pid and q.quantity>=1 

:あなただけのこの操作を行う> = 1、その後の量を表示したい場合はその後、次の操作を行います。

SELECT min(s.size) as size, min(c.color_name) as color, sum(q.quantity) as TotalQty 
FROM quantities q INNER JOIN colors c ON q.color_id = c.color_id 
INNER JOIN sizes s ON q.size_id = s.size_id 
WHERE q.product_id = $pid and q.quantity>=1 
+0

ありがとう私はこのサイトにはとても新しいので、できることすべてを説明しようとしています – alexis

+0

@alexis私のアップデートをチェックしてください。 – Icarus

+0

あなたの助けもありがとう – alexis

0

あなただけの色のストアIDと名前は、それは非常によく、PHPの関数をすることができれば、あなたはカラーテーブルを必要としないので:

<?PHP 
function color($color) 
{ 
    $colors['red']=1; 
    $colors['blue']=2; 
    $colors['green']=3; 

    return $colors[$color]; 
} 
//example of usage 
    $sql ="... where `color`=".color($_POST['color'])." "; 
?> 

また、サイズは小さい値(例:大きなテキストではありません)であるため、サイズテーブルはまったく必要ありません。これは完璧な正常化はありませんが、あなたはすでにこの道を選びまし

mysql_query(" 
CREATE TABLE `Product` (
    `product_id` INT UNSIGNED NOT NULL AUTO_INCREMENT, 
    `product_name` varchar(30) NOT NULL , 
    unique(`product_name`), 
    PRIMARY KEY (`product_id`) 
) ENGINE=InnoDB ROW_FORMAT=COMPACT;") 
or die(mysql_error()); 

mysql_query(" 
CREATE TABLE `Product_Info` (
    `product_id` INT UNSIGNED NOT NULL , 
    `color_code` char(3) NOT NULL , 
    `prod_col_size` varchar(15) NOT NULL , 
    `quantity` mediumint UNSIGNED NOT NULL , 
    PRIMARY KEY (`product_id`,color_code,prod_col_size), 
    CONSTRAINT `prod_id_FK` FOREIGN KEY (`product_id`) 
     REFERENCES `Product` (`product_id`) 
     ON DELETE CASCADE 
) ENGINE=InnoDB ROW_FORMAT=COMPACT;") 
or die(mysql_error()); 

:必要なのは、製品と数量(より良いproduct_infoして名前を変更)テーブルです。このようにクエリは非常に簡単になります。よく正規化されたスキーマで長い結合を気にするのは理にかなっています。何の理由もありません!製品表からいくつかのファイルを提出する必要がある場合に備えて、2つの表で結合する必要があります。

/*Find how many red items has a specific product*/ 

select sum(`Product_Info`.`quantity`) 
    from `Product_Info` where `color_code`='124' and `product_id`='3'; 
関連する問題