2016-09-08 2 views
0

Ich mache ein Produktsystem, wo ein Produkt in einer Sammlung enthalten sein kann.Produkt anzeigen ODER Sammlung

In Produkte 'Seite zeige ich alle Produkte, aber wenn ein Produkt INSIDE eine Sammlung ist, muss ich nur den Namen der Sammlung anzeigen und nicht das Produkt selbst. Ich meine, verstecken Sie die Produkte, die in einer Sammlung sind und zeigen Sie die Sammlung einmal während auch die anderen Produkte (ohne Sammlung).

TABELLE 1: Colecciones ("Sammlungen" in Spanisch) - Wo ich die ID und den Namen der Sammlung speichern.

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

TABELLE 2: Produkte ("Produkte") - Wo ich die Produkte speichern und zu, wenn es sich in einer Sammlung, die Sammlung ID (siehe Spalte "coleccion"). Wenn nicht, ist der Wert 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

am Beispiel der Suche, das Produkt mit dem Namen „manzana“ (Apfel) ist Teil der Sammlung „dulce“ (süß) und das Produkt " Agua "(Wasser) ist nicht Teil einer Sammlung.

Was erwarte ich, um zu zeigen, ist dies:

<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 */ 

ich mit diesem bin stecken. Wie kann ich die Daten auf diese Weise mit PHP anzeigen?

Ich brauche wie productos.id DESC zu bestellen, die ich durch die Zugabe am Ende erreicht:

ORDER BY c.`id` DESC 

Antwort

1

Ich denke, eine Aggregation wird tun, was Sie wollen:

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); 

Die zweite Bedingung in der group by gewährleistet nur, dass Sie zwei Reihen erhalten, wenn das Produkt und coleccion den gleichen Namen haben.

Ich denke auch, das wird für Ihre Zwecke arbeiten:

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

Sie scheinen alle Produkte, die nicht in einer Sammlung zu wollen, sowie die Sammlung Namen (das ist, was diese Abfrage der Fall ist).

EDIT:

Ich bin nicht sicher, welche id Sie wollen, aber Sie tun können:

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

Hallo Gordon. Die erste Abfrage ist total hilfreich für mich, vielen Dank! Bitte, hilf mir zu verstehen; Warum gibt es einige Buchstaben (c auf "c.name", "productos p", "colecciones c" usw.)? –

+0

Nun die Sache ist, die Produkte zeigen wie "ORDER BY productos.nombre ASC", aber ich brauche "ORDER BY productos.id DESC" (die neuesten Produkte werden vorher angezeigt). –

+0

@JimmyAdaro. . . Dies gibt die Produkte in keiner bestimmten Reihenfolge zurück. Sie fragen die Bestellung nicht an. –

1

Wenn die Reihenfolge keine Rolle spielt, nur zwei Abfragen verwenden:

SELECT * FROM productos WHERE coleccion = 0; 

Dies gibt Sie alle Produkte, die nicht in einer Sammlung sind. Obwohl, würde ich empfehlen, NULL anstelle von 0 zu verwenden.

Zweite Abfrage:

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

Dies wird Ihnen alle Sammlungen geben, die Produkte haben.

+0

Danke, Stephen. Wenn ich die zweite Abfrage in phpMyAdmin ausführen, bekomme ich diesen Fehler: "# 1146 - Table 'mytable.colecciones' does not exist" Was könnte das Problem sein? –

+1

Dies bedeutet, dass die Tabelle in der ausgewählten Datenbank nicht existiert. – BadHorsie

+0

Das war ein Tippfehler. Der wirkliche Name ist 'mytable.productos_colecciones', der' mytable.colecciones' war zum Beispiel. –

Verwandte Themen