2016-09-08 151 views
0

我正在做一個產品系統,產品可以包含在一個集合中。顯示產品或集合

在產品頁面中,我展示了所有產品,但是如果某個產品是INSIDE集合,我只需要顯示集合名稱而不是產品本身。我的意思是,隱藏集合內的產品顯示集合一次同時還顯示其他產品(不包括集合)。

表1:colecciones(西班牙語中的「集合」) - 我在哪裏存儲集合的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以這種方式顯示數據?

我需要訂購像productos.id DESC,我通過在末尾添加完成:

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第二個條件只是確保您獲得兩行,當產品和COLECCION具有相同的名稱。

我也認爲這將滿足您的需要:

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

你似乎要的不是一個集合中的所有產品,加上集合名稱(這是這個查詢做什麼)。

編輯:

我不知道你想要的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」(最新的產品顯示之前)。 –

+0

@JimmyAdaro。 。 。這不會以任何特定順序返回產品。你的問題沒有提到順序。 –

1

如果順序並不重要,只要使用兩個查詢:

SELECT * FROM productos WHERE coleccion = 0; 

這會給你所有不在集合中的產品。雖然,我會建議使用NULL而不是0

第二個查詢:

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

這會給你所有具有產品的集合。

+0

謝謝,斯蒂芬。 當我執行在phpMyAdmin第二個查詢,我得到這個錯誤: 「#1146 - 表‘mytable.colecciones’不存在」 可能是什麼問題呢? –

+1

這意味着表格在選定的數據庫中不存在。 – BadHorsie

+0

這是一個錯字。真名是'mytable.productos_colecciones',例如'mytable.colecciones'。 –