Kleinster Preis aus mehreren Tabellen

Murkasfjphy

Grünschnabel
Hallo,

ich brauche den kleinsten Wert einer Spalte aus mehreren Tabellen. Die Verknüpfung aller Tabellen erfolgt über eine eindeutige ID.
(Die Datenbank ist MySQL5)

So weit bin ich bis jetzt, ich bekomme aus allen Tabellen den Preis angezeigt:

SELECT tb1.breite, tb1.vk_preis, tb2.vk_preis, tb3.vk_preis
FROM db.tb1 AS tb1
LEFT JOIN db.tb2 AS tb2 ON tb1.id = tb2.id
LEFT JOIN db.tb3 AS tb3 ON tb1.id = tb3.id
where tb1.breite = 123

Aber wie bekomme ich daraus jetzt den kleinsten Preis ermittelt?
Die Funktion Min() spielt dabei sicherlich eine Rolle, aber wie muss ich ansetzen?

Danke für jeden Tipp!

Gruß Marcel
 
Zuletzt bearbeitet:
Hallo zeja,

Danke für Deinen Beitrag.

Ich brauche den kleinsten Preis und dann noch den Lagerbestand zu dieser Position.
Hast Du eine Idee?

Danke + Gruß

Marcel
 
Ein naiver Ansatz wäre:
SQL:
SELECT
	`tb1`.`breite`		AS `breite`,
	IF `tb1`.`vk_preis` > `tb2`.`vk_preis` THEN
		IF		`tb2`.`vk_preis` > `tb3`.`vk_preis` THEN `tb3`.`vk_preis`
		ELSE	`tb2`.`vk_preis`
	END IF
    ELSE
		IF		`tb3`.`vk_preis` > `tb1`.`vk_preis` THEN `tb1`.`vk_preis`
		ELSE	`tb1`.`vk_preis`
	END IF
    END IF				AS `vk_preis`
FROM
	`db`.`tb1` AS `tb1`
LEFT JOIN
	`db`.`tb2` AS `tb2` ON
	`tb1`.`id` = `tb2`.`id`
LEFT JOIN
	`db`.`tb3` AS `tb3` ON
	`tb1`.`id` = `tb3`.`id`
WHERE
	`tb1`.`breite` = 123
Jedoch nicht wirklich effizient...

Leider ist mir keine Möglichkeit bekannt, anonyme Mengen in MySQL on the fly zu erstellen - Eventuell wäre eine temporäre Tabelle hier genau richtig?

Stichwort UNION, oder HAVING - Vielleicht ließe sich etwas über eine Vereinigung machen.

Habe mal kurz probiert:
SQL:
SELECT MIN( `temp` ) FROM (
 SELECT 1 AS `temp` UNION SELECT 2 UNION SELECT 3
) AS `t`
Das gibt wirklich 1 zurück, ist aber für die benötigte Form etwas komplexer zu formulieren.

EDIT: In etwa so... (ungetestet)
SQL:
SELECT
	`tb1`.`breite`		AS `breite`,
	(	SELECT
			MIN( `t`.`temp` )
		FROM (
				SELECT
					`tb1t`.`vk_preis` AS `temp`
				FROM
					`db`.`tb1` AS `tb1t`
				WHERE
					`tb1`.`id` = `tb1t`.`id`
			UNION
				SELECT
					`tb2t`.`vk_preis`
				FROM
					`db`.`tb2` AS `tb2t`
				WHERE
					`tb1`.`id` = `tb2t`.`id`
			UNION
				SELECT
					`tb3t`.`vk_preis`
				FROM
					`db`.`tb3` AS `tb3t`
				WHERE
					`tb1`.`id` = `tb3t`.`id`
			) AS `t`
	)					AS `min_vk_preis`
FROM
	`db`.`tb1` AS `tb1`
;
 
Zuletzt bearbeitet:
Moin maeTimma,

sauber und gut nachvollziehbar, Deine Lösungsskizze, aber...

dieser Weg klapp doch nur soweit, wie alle Attribute (Breite, Höhe, Gewicht etc.) der "Id"s aus der Tabelle tbl auch für alle anderen "gleichen" Ids in tbl1, tb2, tblN gelten.
- Ja, sind dann auch alle im gleichen Lager?

- Und will denn hinterher niemand wissen, in welcher der Tabellen der minimale Preis steht?

- Was passiert, wenn es nicht EINEN minimalen Preis gibt, sondern der Artikel in allen tbl1, tbl2, tbl3 ..-Tabellen genau 10 Euro fuffzig kostet? Ist dann (fachlich) ein Resultset mit einem Satz korrekt?

- Und WTF ist denn die "tbl" als Master-Tabelle anzusehen (von der gehen ja LEFT joins ab in den oberen Skripten)? Es sieht für mich eher danach aus, als wären es gleichwertige Tabellen mit exakt gleicher Feldstruktur und Datenqualität.

Ich kenne diesen Thread schon aus einem Nachbarforum und empfehle nach wie vor, statt dieser x Parallel-Tabellen mindesten einen großen VIEW (mit UNION ALL) zu machen...
Eigentlich aber: Eine Tabelle daraus zu machen mit neuem PK (statt Id dann Id+irgendein Quellkennzeichen).

Redesign statt nicht wartbarer SQL-Verrenkungen.

Grüße
Biber
 
Gut erläutert, Biber. Von diesem Ansatz ausgehend stimme ich dir vollkommen zu.

Wollte zuerst auch etwas Ähnliches schreiben, nur ist mir dann die etwas missglückte Tabellenstrukturierung eines Warenwirtschaftssystems, mit dem ich vor kurzem oberflächlich zu tun hatte, eingefallen, welche für bestimmte Kundengruppen einzelne Tabellen anlegte. Im Prinzip erfasste eine "Haupttabelle" die wichtigen Daten (vgl. `tb1`) und einen Standardpreis, Händlerpreise und dergleichen wurden in einer zweiten Tabelle erfasst.

Klar, sobald es Unterschiede zwischen den Datensätzen der Tabellen gibt, ist mein Ansatz wertlos. Unter den oben gemachten Angaben, und dem Ansatz der inneren Joins (LEFT JOIN db.tb2 AS tb2 ON tb1.id = tb2.id LEFT JOIN db.tb3 AS tb3 ON tb1.id = tb3.id) würde es meiner Meinung nach durchaus zur Problematik passen.

Biber2 hat gesagt.:
dieser Weg klapp doch nur soweit, wie alle Attribute (Breite, Höhe, Gewicht etc.) der "Id"s aus der Tabelle tbl auch für alle anderen "gleichen" Ids in tbl1, tb2, tblN gelten.
- Ja, sind dann auch alle im gleichen Lager?
Berechtigte und gute Frage - Das würde die Sache dann ein wenig verkomplizieren und weitere Unterabfragen erfordern, sollte ich überhaupt den richtigen Ansatz gewählt haben.

Biber2 hat gesagt.:
- Und WTF ist denn die "tbl" als Master-Tabelle anzusehen (von der gehen ja LEFT joins ab in den oberen Skripten)? Es sieht für mich eher danach aus, als wären es gleichwertige Tabellen mit exakt gleicher Feldstruktur und Datenqualität.
In diesem Fall wäre Merge-ISAM eventuell sinnvoll, leider habe ich diesbezüglich nicht wirklich Ahnung von der Materie.
 
Zurück