2016-09-08 14 views
0

商品をコレクション内に入れることができる商品システムをやっています。商品の表示ORコレクション

商品のページはすべての商品を表示していますが、商品がコレクションの中にある場合は商品名ではなくコレクション名のみを表示する必要があります。つまり、コレクション内にある製品を隠すことになりますコレクションを一度と表示し、他の製品(コレクションなし)も表示します。

表1:colecciones( "collections" in Spanish) - ここでは、コレクションのIDと名前を格納しています。

CREATE TABLE `colecciones` ( 
    `id` INT(255) NOT NULL AUTO_INCREMENT , 
    `nombre` VARCHAR(100) NOT NULL , 
    PRIMARY KEY (`id`) 
); 

INSERT INTO `colecciones` 
    (`nombre`) 
VALUES 
    ('dulce'),('salado'),('agrio') 
; 

http://sqlfiddle.com/#!9/8534e/1/0

表2:PRODUCTOS( "製品") - それは、コレクション内にある場合、私は、製品を保管して、コレクションID(欄 "COLECCION")。そうでない場合、値は0です。例を見てみると

CREATE TABLE `productos` ( 
    `id` INT(255) NOT NULL AUTO_INCREMENT , 
`nombre` VARCHAR(100) NOT NULL , 
`coleccion` INT(255) NOT NULL , 
PRIMARY KEY (`id`) 
); 

INSERT INTO `productos` 
    (`nombre`, `coleccion`) 
VALUES 
    ('manzana',1),('salmon',2),('sandia',0),('sopa',3),('pera',1),('agua',0) 
; 

http://sqlfiddle.com/#!9/6aef2/1/0

で、名前「manzana」(りんご)との積は、「コレクションの一部「ドゥルセ」(甘い)、および製品ですアグア "(水)はコレクションの一部ではありません。私はこれにこだわっている

<h1>My products</h1> 

dulce /* (ID 1 table `colecciones`) because I have products with "coleccion = 1" */ 
salado /* (ID 2 table `colecciones`) because I have products with "coleccion = 2" */ 
sandia /* the product itself, not collection */ 
agrio /* (ID 3 table `colecciones`) because I have products with "coleccion = 3" */ 
agua /* the product itself, not collection */ 

:私は示すことが期待

はこれです。この方法でデータをPHPでどのように表示できますか?

SELECT * FROM productos WHERE coleccion = 0; 

これは与える:順序は重要ではありません場合は

ORDER BY c.`id` DESC 

答えて

1

私は、凝集が、あなたがやりたいだろうと思う:

select (case when c.name is not null then c.name else p.name end) as name 
from productos p left join 
    colecciones c 
    on p.coleccion = c.id 
group by name, (c.name is not null); 

group byにおける第2の条件は単に製品やCOLECCIONが同じ名前を持っているときに2つの行を取得することを保証します。

また、私は、これはあなたの目的のために働くだろうと思う:

select p.name from productos where coleccion = 0 
union all 
select c.name from colecciones; 

あなたがいないコレクションプラス(このクエリが何をするかである)のコレクション名にすべての製品を望んでいるように見えます。

EDIT:

私はあなたが望むどのIDわからないんだけど、あなたは何ができる:

select p.name, p.id from productos where coleccion = 0 
union all 
select c.name, c.id from colecciones 
order by id desc; 
+0

こんにちはゴードン。最初のクエリは私にとって非常に便利です。ありがとうございます!してください、理解するのを助けてください。なぜいくつかの手紙があります( "c.name"、 "productos p"、 "colecciones c"など)? –

+0

今、製品は "ORDER BY productos.nombre ASC"のように表示されていますが、 "ORDER BY productos.id DESC"が必要です(前の製品は前に表示されています)。 @JimmyAdaro。 –

+0

。 。これは特定の順序で製品を返すことはまったくありません。質問にはその注文は言及されていません。 –

1

、ちょうど2つのクエリを使用します。

は、私が最後に添加することにより達成productos.id DESC、のように注文する必要がありますコレクションに含まれていないすべての製品しかし、0の代わりにNULLを使用することをお勧めします。

2番目のクエリ:

SELECT colecciones.* FROM productos 
INNER JOIN colecciones on colecciones.id = productos.coleccion 
GROUP BY coleccion; 

これはあなたの製品を持っているコレクションのすべてを提供します。

+0

おかげで、スティーブン。 私はPHPMyAdminの中に2番目のクエリを実行すると、私はこのエラーを取得: - 問題がある可能性が何 を「#1146テーブル 『mytable.colecciones』が存在しませんか」? –

+1

これは、選択したデータベースにテーブルが存在しないことを意味します。 – BadHorsie

+0

それはタイプミスでした。実名は 'mytable.productos_colecciones'、' mytable.colecciones'は例えばです。 –

関連する問題