"We are back" « oc.at

Verschachtelte sql Abfragen in php

Grent 19.05.2010 - 17:21 1603 7
Posts

Grent

Big d00d
Avatar
Registered: Jun 2002
Location: Austria
Posts: 257
Ich mathematisch leider etwas überfordert.

Ich habe eine Tabelle mit 2 Spalten. In etwa so:

A | 0
B | 0
A | 1
A | 2
B | 0
A | 5

Ich bräuchte nun eine Abfrage, die mir ausgibt, welcher Wert in Spalte 1 am öftesten den Wert 0 in Spalte 2 hat (wäre dann also B), sowie eine die mir sagt, welcher Wert in Spalte 1 am öftesten den Wert 1 oder 2 in Spalte 2 hat (wäre dann also A).

Vielleicht weiß jemand etwas auf den schnellen Blick.

Ich hoffe, dass mir die Lösung für oben auch den entscheidenden Hinweis für den Ansatz eines (für mich) noch komplexeren Problems bringt:

A | 0 | 1
B | 5 | 1
A | 2 | 4

Und zwar hätte ich gern die größte Summe von Spalte 2 und 3 mit dem selben Wert in Spalte 1. Das wäre also 7 (bei A; nur 6 bei B).

Von Disctinct über Group by von sum über max ... ich komm einfach nicht drauf.
Leider hab ich Probleme mit diesen doppelten, verschachtelten Abfragen. :(

Vielen Dank! :)

Nico

former person of interest
Registered: Sep 2006
Location: -
Posts: 4082
welche datenbank?

Lizardking

Big d00d
Avatar
Registered: Nov 2004
Location: sogined
Posts: 167
hi, versuch mal folgendes:

Bsp 1
SELECT field_1, count(*) FROM table_1 WHERE field_2='0' GROUP BY field_1 ORDER BY count(*) DESC LIMIT 1

Bsp 2
SELECT field_1, sum(field_2+field_3) FROM table_2 GROUP BY field_1 ORDER BY sum(field_2+field_3) DESC LIMIT 1

hth
Bearbeitet von Lizardking am 19.05.2010, 17:58

kleinerChemiker

Here to stay
Avatar
Registered: Feb 2002
Location: Wien
Posts: 4295
Falls ich Bsp.2 richtig verstanden habe, dann wäre eher das die Lösung.

SELECT field_1, count(*) FROM table_1 WHERE field_2 IN(1,2) GROUP BY field_1 ORDER BY count(*) DESC LIMIT 1

Grent

Big d00d
Avatar
Registered: Jun 2002
Location: Austria
Posts: 257
Zitat von Nico
welche datenbank?

Sorry, ich meinte mysql.


@Lizardking & kleinerChemiker

Vielen Dank!!
Habe alle drei Code-Schnipsel einbauen und daraus lernen können.
Genau, was ich gebraucht habe. :)

Lizardking

Big d00d
Avatar
Registered: Nov 2004
Location: sogined
Posts: 167
na freut mich :)

Vielleicht ist das auch die richtige Stelle für einen Exkurs, ich hätte da nämlich eine kleine Zusatzfrage:
Weiß jemand, ob die folgenden 2 Schnipsel einen Performanceunterschied machen?

1) SELECT sum(f_1, f_2) FROM tbl ORDER BY sum(f_1, f_2)
2) SELECT sum(f_1, f_2) as my_sum FROM tbl ORDER BY my_sum

Die konkrete Frage ist, ist 1) langsamer, weil die Summe 2x gebildet werden muss oder ist MySQL so schlau und macht implizit das was bei 2) steht?
Im Normalfall wird's keinen Unterschied machen, interessant fände ich's trotzdem.

LGL

watchout

Legend
undead
Avatar
Registered: Nov 2000
Location: Off the grid.
Posts: 6845
Ich weiss es nur für 1-parametrische funktionen also zb.
SELECT abs(f_1) ...
hier wär 2. schneller, weil bei 2. der index fürs ORDER BY verwendet wird und bei 1 nicht.

Und daher vermut ich mal vorsichtig dass auch solche subsitutionen nicht automatisch gemacht werden ;)

meepmeep

Here to stay
Avatar
Registered: Feb 2006
Location: Wien
Posts: 2337
ich vermute dass es wurscht is, weil der optimizer das ausbügelt und am ende der selbe ausführungsplan rauskommt.

du könntest aber schaun ob du mit "explain [select statement]" auf eine antwort kommst.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz