Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
SQL-Abfrage mit Ausgabe limitierter Datensätze [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
SQL-Abfrage mit Ausgabe limitierter Datensätze


 
Berni
08-08-2002, 18:04 
 
Hallo zusammen,

ich brauche mal einen einen MYSQL Spezialisten.

Das Problem ist:

Ich habe 1 Tabelle mit folgendem Inhalt

ORT | Name
===========
FFM | Name1
FFM | Name2
FFM | Name3
FFM | Name4
FFM | Name5
FFM | Name6
OF | Name7
OF | Name8
OF |USW.
OF |
DA |Name1001
DA |Name1002

Wie kann ich das folgende Ergebnis mit einer mySQL-Query umsetzten


ORT | Name
===========
FFM | Name1
FFM | Name2
OF | Name7
OF | Name8
DA | Name999
DA | Name1000

Also immer nur 2 Datensätze für eine Ort ausgeben mit unterschiedlichem Name.

Hat jemand eine Idee?

Danke
Berni

 
hand
08-08-2002, 19:10 
 
<?php
$select = "SELECT DISTINCT(ort) AS ort FROM tabelle";
$berni = mysql_query($select);
while ($hand = mysql_fetch_assoc($berni)) {
$innerselect = "SELECT ort, name FROM tabelle where ort = '$hand[ort]' LIMIT 2";
$innerberni = mysql_query($innerselect);
while ($innerhand = mysql_fetch_assoc($innerberni)) {
print "$innerhand[ort] | $innerhand[name]<br>\n";
}
mysql_free_result($innerberni);
}
mysql_free_result($berni);
?>

 
MoRtAlAn
08-08-2002, 19:17 
 
mh... bekommst du das auch in einem SQL-Statement hin ??

gruss

 
hand
08-08-2002, 19:22 
 
Nein - Ich nicht - aber za was?
Du? :D

 
Berni
08-08-2002, 19:23 
 
thanks Hand,

deine Lösung erzeugt zu viele DB-Zugriffe.
Ich brauche eine SQL-Anweisung. Ich dachte da an Having und Group by.

Gruß
Berni

 
hand
08-08-2002, 19:26 
 
Und wenns gar nicht geht anders?
Was dann? Das mit dem Limit 2 ist schon eine Herausforderung - ich behaupte einfach ganz frech, das geht nicht anders.

Bin mal gespannt auf eine Lösung ....

 
hand
08-08-2002, 19:42 
 
Mit einem SELECT ginge es auch, wenn man danach ensprechend die Daten nach Ort-Gruppenwechseln verarbeitet.

SELECT ort, name FROM tabelle ORDER BY ort, name

Aber wahrscheinlich spricht auch die Datenmenge (Timeout) dagegen.

Was wäre wenn man die Anforderung von zwei Records je Ort auf einen Record zurückschraubte?

 
Berni
08-08-2002, 19:50 
 
Mit dem Gruppenwechsel habe ich mir auch schon überlegt.
Ich glaube aber auch das es mit mysql nicht funktioniert.

Naja Dann müssen halt ein paar SQL-Anweisungen her :)

thank
berni

 
MelloPie
08-08-2002, 23:00 
 
Ich denke das geht nicht, aber was geht ist doch in der while ($result) Schleife einfach immer wenn der Ort gleich ist nur die ersten beiden datensätze auszugeben.
etwa so:

$anz_ort = 0;
$result = mysql_query("SELECT * FROM tbl");
while ($zeile = mysql_fetch_row($result)) {
if($ort != $zeile[0]) $anz_ort = 0;
$ort = $zeile[0];
if($anz_ort < 2) echo $zeile[0].":".$zeile[1]."<br>";
$anz_ort++;
}

Dann haste eine Abfrage und gibst nur aus was Du willst

 
Berni
08-08-2002, 23:05 
 
jo, und was mache ich bei 150000 Datensätze?
Das würde ziemlich lang dauern..

Danke
Berni

 
MelloPie
09-08-2002, 15:34 
 
Hm... da magste Recht haben, wie schauts aus mit zwischenspeichern in einer temp tabelle mit

SELECT INTO tmp_tbl blabla

Das ganze zweimal machen mit LIMIT 0,1 und LIMIT 1,1 bei gleichem SQL Statement und der angesprochenen GROUP BY ort Gruppierung,

dann das Ergebnis aus der tmp_tbl mit ORDER BY ort lesen...


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:33 Uhr.