Ich gehe davon aus, dass Sie meinen, Sie möchten den idArtikel, der aufgrund der Daten aus allen drei Tabellen am teuersten ist. Für jede Tabelle benötigen Sie den idund den Preis der Artikel mit dem Höchstpreis in dieser Tabelle. Für eine Tabelle ist das:
SELECT id, price FROM Tn WHERE price = (SELECT MAX(price) FROM Tn)
Es gibt also eine Unterabfrage:
SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
Und Sie müssen einen der idWerte mit dem Maximalpreis aus dieser Unterabfrage finden:
SELECT id
FROM (SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
) AS M
ORDER BY price DESC
LIMIT 1
Beachten Sie, dass die UNION-Abfrage mehr als 3 Zeilen zurückgibt, wenn in einer der Tabellen zwei gleich teure Elemente aufgeführt sind. Wenn zwei oder mehr gleich teure Elemente vorhanden sind, wählt die Abfrage mit dem LIMIT eines aus, und Sie können nicht vorhersagen, welches. Wenn Sie alle idWerte von gleich teuren Gegenständen sehen möchten, die am meisten kosten, müssen Sie ein ähnliches Spiel mit verschachtelten Abfragen spielen. Das macht mich wahnsinnig, sollte aber funktionieren:
SELECT id, price
FROM (SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
) AS M
WHERE price =
(SELECT MAX(Price)
FROM (SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
) AS M2
);
Dies wäre mit einer WITH-Klausel einfacher:
WITH MaxPrices AS
(SELECT id, price FROM T1 WHERE price = (SELECT MAX(price) FROM T1)
UNION
SELECT id, price FROM T2 WHERE price = (SELECT MAX(price) FROM T2)
UNION
SELECT id, price FROM T3 WHERE price = (SELECT MAX(price) FROM T3)
)
SELECT id, price
FROM M
WHERE price = (SELECT MAX(Price) FROM M);
Nicht jedes DBMS unterstützt die WITH-Klausel wie diese, und ich glaube, MySQL ist eines der DBMS in der Kategorie, die diese Unterstützung nicht enthält.