2012-03-29 4 views
0

Ich habe auf ein Problem gestolpert, das ich nicht herausfinden kann. Ich mache eine Liste von Preisen für Produkte, wo es die Preise von drei Spalten (price1, price2, price3) nimmt, wo jede Preisspalte für eine spezifische Version dieses Produktes ist.Reihenfolge durch ein bestimmtes Feld und ein anderes Feld, wenn in TYPO3-Erweiterung leer

Einige der Produkte haben möglicherweise keinen Preis im Preis 1, da sie in dieser Version nicht existieren und einige Produkte haben nur einen Preis im Preis3.

Haben kann ich eine ORDER BY bekommen, die die Produkte nach Preisen sortiert auflisten, also wenn ein Produkt, das den Preis 5400 nur in price3 hat, nach dem Produkt aufgeführt wird, das den Preis 5300 in price1 hat.

Wenn ich ORDER BY price1, werden die Produkte, die keinen Preis in price1 haben, oben aufgelistet.

ich die Erweiterung TYPO3-Overlays bin mit dem von SQL-Anweisung ist

tx_overlays::getAllRecordsForTable('*', 'tx_rtmur_bricks', $where, '', 'price1 ASC'); 

das '' nach, wo ist GROUP BY

EDIT:

Dies ist, wie es jetzt aufgeführt wird:

Product 472 
Price pr 1000 pcs: 7.730 in version 3 

Product 201 
Price pr 1000 pcs: 5.690 in version 1 
Price pr 1000 pcs: 7.315 in version 2 

Product 301 
Price pr 1000 pcs: 5.690 in version 1 
Price pr 1000 pcs: 7.315 in version 2 

Product 309 
Price pr 1000 pcs: 6.760 in version 1 
Price pr 1000 pcs: 7.350 in version 3 

Ich möchte es auf diese Weise sortiert werden:

Product 201 
Price pr 1000 pcs: 5.690 in version 1 
Price pr 1000 pcs: 7.315 in version 2 

Product 301 
Price pr 1000 pcs: 5.690 in version 1 
Price pr 1000 pcs: 7.315 in version 2 

Product 309 
Price pr 1000 pcs: 6.760 in version 1 
Price pr 1000 pcs: 7.350 in version 3 

Product 472 
Price pr 1000 pcs: 7.730 in version 3 
+0

Können Sie ein Beispiel geben, wie Sie die Ergebnisse bestellen möchten.Fügen Sie das Ergebnis der aktuellen Ergebnisse und zeigen Sie uns, wie Sie es ändern möchten .. – barsju

Antwort

0

Ich würde Ihre Datenbankstruktur Refactoring und erstellen Sie eine separate Tabelle für die Produktversion empfehlen, wo die Preise sind enthalten:

Product_version: 
id, 
productId (foreign key), 
version (name or number..), 
price 

, dass diese Art von Fragen machen würde einfacher und es ist einfacher, wenn die Verwaltung Sie haben mehr oder weniger dann genau drei Versionen ..

Ihre Anfrage so etwas wie sein würde:

select * from product p 
inner join version v on p.id = v.pid 
group by p.id, price asc; 
+0

Argh .. Ich fürchtete diese Antwort .. Ich habe etwa 80 Produkte mit etwa 2 Preisen und 3 Sprachen. Die DB-Struktur wurde so gemacht, wie es ist, weil es nur 2 Preise in einer Sprache sein sollte und ich ORDER BY price1. Hat dies nicht berücksichtigt. –

1

Ok hier ist eine andere Antwort für Sie. Ich empfehle immer noch die vorherige, und Refactoring Ihren Code und Ihre Datenbank wird einige Arbeit nehmen, es ist nicht unmöglich. Das Upgrade-Skript für Ihre Datenbank sollte ziemlich einfach zu schreiben sein, so dass Sie alle Ihre Daten behalten können.

Wie auch immer, hier ist eine Lösung. Auch hier müssen Sie die Feldnamen übersetzen, weil ich diese mit meinem eigenen Test-Set gebaut:

select * from 
(select id as id, "version 1" as version , price1 as price from tx_rtmur_bricks 
    where price1 is not null 
    union 
    select id, "version 2", price2 from tx_rtmur_bricks where price2 is not null 
    union 
    select id, "version 3", price3 from tx_rtmur_bricks where price3 is not null 
) p 
group by p.id, p.price asc; 

So sehen Sie, wie viel komplexer wird es ..

Sie müssen vielleicht die Gruppe von params zwicken und einige Spalten der wählt hinzufügen genau das bekommen, was Sie wollen ..

Edit: Das Ergebnis etwas sein sollte:

Product, Version, Price 
123, "Version 1", 5.50 
123, "Version 3", 7.50 
134, "Version 1", 5.50 
134, "Version 2", 6,50 
154, "Version 3", 8,50 
etc 
+0

Dies scheint etwas richtig zu machen, aber es zeigt nur einen Preis, wo ich den Preis für jede Version jedes Produktes anzeigen möchte. Wenn ein Produkt Versionen hat, wird es Preis1 und Preis3 und nur Preis 1 oder anzeigen price2 für ein anderes Produkt. –

+0

Es wird eine Zeile für jede Version angezeigt, genau wie in Ihrem Beispiel. – barsju

0

Dies ist ein Schuss lang ist, da ich nicht diese r testen jetzt. Aber vielleicht können Sie bei CASE bestellen?

SELECT * FROM Product 
ORDER BY ProductID, CASE WHEN Price3 IS NULL THEN 
CASE WHEN Price2 IS NULL THEN Price1 ELSE Price2 END ELSE Price3 END 
+0

das scheint leider nicht zu funktionieren ... :( –