显示产品或集合

时间:2016-09-08 21:32:56

标签: php mysql sql select distinct

我正在制作一个产品系统,产品可以包含在一个系列中。

在产品中'第一页显示所有产品,但如果某个产品是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:产品("产品") - 我存储产品的位置,如果是在集合中,则存储集合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" (苹果)是收藏品的一部分" dulce" (甜蜜的)和产品" agua" (水)不是任何收藏品的一部分。

我希望展示的是:

<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

2 个答案:

答案 0 :(得分:1)

如果订单无关紧要,只需使用两个查询:

number of objects in each section -1

这将为您提供不在集合中的所有产品。不过,我建议使用SELECT * FROM productos WHERE coleccion = 0; 代替NULL

第二次查询:

0

这将为您提供所有具有产品的集合。

答案 1 :(得分: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;