2017-12-25 1 views
0

In meiner Anfrage hiereine Abfrage enthält MAX() und MIN() mit ihren eigenen Bedingungen

$Query = "SELECT id, name FROM names WHERE age = 18 LIMIT 1"; 

I MIN() und MAX() mit einer Bedingung hinzugefügt werden soll, als ob ich eine andere Abfrage wie diese

gemacht

$MQuery = "SELECT MAX/MIN(age) FROM names LIMIT 1";

Meine Lösung wurde die Zusammenlegung der drei Abfragen zusammen, wie diese

$Query = "SELECT id, name, 
(SELECT MAX(age) FROM names WHERE age = 18 AND age > 18 LIMIT 1) as MAX, 
(SELECT MIN(age) FROM names WHERE age = 18 AND age < 18 LIMIT 1) as MIN 
FROM names WHERE age = 18 LIMIT 1"; 

Aber ich frage mich, ob es eine effizientere Art und Weise und schneller, es zu schreiben, wie

$Query = "SELECT id, name, 
(MAX(age) WHERE age > 18) as MAX, 
(MIN(age) WHERE age < 18) as MIN 
FROM names WHERE age = 18 LIMIT 1"; 

auch, Gibt es eine Idee von LIMIT 1 oder DISTINCT mit MAX/MIN() -nur Abfragen mit?

Was ich erwarte, ist, dass, wenn es 17 Alter 19 oder Alter ist es MIN und MAX mit zu fangen, wenn sie

existieren
[id - name - max -min 
[1 - Mario - 19 - 17] 

Tisch sein würde wie

[id - name - age] 
[1 - mario - 18] 
[2 - arizo - 18] 
[3 - bruno - 17] 
[4 - arizo - 19] 
[5 - mario - 18] 
+0

Was Willst du fertig werden? Was ist die erforderliche Ausgabe? – Vashi

+0

@Vashi Ich möchte das nächste/vorherige 'Alter' erhalten, wenn sie existieren .. wird jetzt ein Beispiel hinzufügen – Toleo

+0

Nächste/vorherige Alter wrt 18? – Vashi

Antwort

2

MAX(CASE WHEN..) Weg sein könnte aus. Auch habe ich die Gleichheitszeichen geändert (wenn das Alter größer als 18 ist, willst du das Mindestalter in [19 zu was auch immer] und für Alter unter 18 willst du maximal in [1 bis 17] alt sein). t die Notwendigkeit LIMIT 1

SELECT id, name, 
MAX(CASE WHEN age<18 THEN age END) as Max_age, 
MIN(CASE WHEN age>18 THEN age END) as Min_age 
FROM names 
GROUP BY id, name; 

. Hinweis:. die nächsten/vorherigen Alter wRT 18 wird nur das heißt zu einem bestimmten id in Betracht gelten, wenn diese bestimmte id hat mehr als ein Eintrag mit unterschiedlichen Alters

+0

Ich muss 'LIMIT 1' benutzen wegen einiger duplizierter Einträge, ich habe es mit und ohne' LIMIT 1' versucht, habe aber keine Werte erhalten, liegt es daran, dass ich 'WHERE age = 18' habe? – Toleo

+0

Können Sie einige Beispieleinträge für eine ID hinzufügen? – Vashi

+0

Und ja, 'WHERE Alter = 18 'scheint nicht erforderlich zu sein (ich habe es nicht in meinem Post verwendet). Hast du es ohne WHERE-Bedingung versucht? – Vashi