Zurück   klamm-Forum > klamm-Lose > Lose4Scripts > Lose4Scripts (erledigt)

 
 
LinkBack Themen-Optionen Ansicht
Alt 09.12.2006, 10:50:58   #1 (permalink)
Erfahrener Benutzer

ID: 99340
Lose-Remote

Reg: 20.04.2006
Beiträge: 1.256
Standard [S] Einfache SQL Abfrage für 1 MIO

Jo also ich brauche eine SQL Abfrage!
ich habe 2 tabellen!

threads:

id Der rest ist unwichtig!(text und sowas)
1
2
3

dann noch die tabelle:

replys:

id time
1 123
1 234
2 345


so und mir soll nun folgendes Abgerufen werden:

ALLE Threads aus der tabelle threads! so und dann soll FALS noch ein reply zu dem thread vorhanden ist (replys haben immer die gleiche id wie der thread auf den gepostet wurde) dann soll die letzt time abgerufen werden heißt es müsste nachher rauskommen:

id 1, time 234
id 2, time 345
id 2, time 0


1 MIO gibts für den, der mir diese abfrage schreibt!
 
Programmierer ist offline  
Alt 09.12.2006, 11:04:57   #2 (permalink)
Entwickler

ID: 142585
Lose-Remote

Reg: 05.05.2006
Beiträge: 109
Standard

$res = mysql_query("SELECT id FROM Threads");
$num = mysql_affected_rows();
for($a = 0; $a < $num; $a++)
{
$ThreadID = mysql_result($res,$a,"id");
$resReply = mysql_query("SELECT time FROM Replys WHERE threadid = '$ThreadID' ORDER BY ReplyID DECS LIMIT 1");
$numReply = mysql_affected_rows();
if($numReply > 0)
$ReplayTime = mysql_result($resReply,0,"time");
echo" ThreadID: $ThreadID Time: $ReplayTime ";
}
}

nu bekommst du ne liste aller threads und aller replys mit zeit, habe ich das so richtig verstanden?

ThreadID: 1 Time: 3432
ThreadID: 2 Time: 8574
usw.



Edit: Nochmal verändert, nun nimmt er nur das letze reply, falls mehrere vorhanden sind
 

Geändert von Caveman (09.12.2006 um 11:11:23 Uhr)
Caveman ist offline  
Alt 09.12.2006, 11:09:41   #3 (permalink)
Erfahrener Benutzer

ID: 99340
Lose-Remote

Reg: 20.04.2006
Beiträge: 1.256
Standard

Zitat:
Zitat von Caveman Beitrag anzeigen
$res = mysql_query("SELECT id FROM Threads");
$num = mysql_affected_rows();
for($a = 0; $a < $num; $a++)
{
$ThreadID = mysql_result($res,$a,"id");
$resReply = mysql_query("SELECT time FROM Replys WHERE threadid = '$ThreadID'");
$numReply = mysql_affected_rows();
for($b = 0; $b < $numReply; $b++)
{
$ReplayTime = mysql_result($resReply,$b,"time");
echo" ThreadID: $ThreadID Time: $ReplayTime ";
}
}

nu bekommst du ne liste aller threads und aller replys mit zeit, habe ich das so richtig verstanden?

ThreadID: 1 Time: 3432
ThreadID: 1 Time: 3328
ThreadID: 2 Time: 8574
usw.
ne ich brauche jeden thread nur 1 mal (jede id) und dann die time vom letzten reply der gepostet wurde (der die höchste time hat ^^)


Und außerdem: in php hätt ichs auch gekonnt ich brauche das ganze in 1 mysql abfrage

ps: es gibt auch while!

nicht das ganze for gedööns sondern einfach:

while($data = mysql_fetch_array($query)){

}
 

Geändert von Programmierer (09.12.2006 um 11:11:09 Uhr)
Programmierer ist offline Threadstarter  
Alt 09.12.2006, 11:11:54   #4 (permalink)
Entwickler

ID: 142585
Lose-Remote

Reg: 05.05.2006
Beiträge: 109
Standard

habe es nochmal verändert, nu gibt er dir nur den letzen
 
Caveman ist offline  
Alt 09.12.2006, 11:14:00   #5 (permalink)
Erfahrener Benutzer

ID: 99340
Lose-Remote

Reg: 20.04.2006
Beiträge: 1.256
Standard

jop so Wäääre es richtig aber der ganze code passt in 1 sql abfrage und wenn du mir die nennst dann bekommst du die mio!
 
Programmierer ist offline Threadstarter  
Alt 09.12.2006, 11:23:00   #6 (permalink)
Entwickler

ID: 142585
Lose-Remote

Reg: 05.05.2006
Beiträge: 109
Standard

Das ist aber ne art der programmierung die ich nur ungerne mache
das tolle am proggen ist ja das 1000 wege nach rom führen und man sich aussuchen kann welchen man geht.

da vertrette ich eher die meinung das ich meinen source später auch nochmal lesen möchte


das musste dann mit joins machen

$res = mysql_query("SELECT Reply.time, Threads.id FROM Threads AS Thread, Replys AS Reply WHERE Reply.threadid = Thread.id ORDER BY DESC Thread.id");

das problem ist hierbei das der nun das Limit nicht machen kann, zumindest wüsste ich nicht wie.
 

Geändert von Caveman (09.12.2006 um 11:24:52 Uhr)
Caveman ist offline  
Alt 09.12.2006, 11:27:20   #7 (permalink)
Erfahrener Benutzer

ID: 99340
Lose-Remote

Reg: 20.04.2006
Beiträge: 1.256
Standard

Zitat:
Zitat von Caveman Beitrag anzeigen
Das ist aber ne art der programmierung die ich nur ungerne mache
das tolle am proggen ist ja das 1000 wege nach rom führen und man sich aussuchen kann welchen man geht.

da vertrette ich eher die meinung das ich meinen source später auch nochmal lesen möchte
das haben die vom VMS auch gedacht und was kam bei raus? zuviele db abfragen ;-)


Zitat:
Zitat von Caveman Beitrag anzeigen
das musste dann mit joins machen

$res = mysql_query("SELECT Reply.time, Threads.id FROM Threads AS Thread, Replys AS Reply WHERE Reply.threadid = Thread.id ORDER BY DESC Thread.id");

das problem ist hierbei das der nun das Limit nicht machen kann, zumindest wüsste ich nicht wie.
dann würde ich aber wieder soviele bekommen, wie replys da sind!
 

Geändert von Programmierer (09.12.2006 um 11:28:22 Uhr)
Programmierer ist offline Threadstarter  
Alt 09.12.2006, 11:29:22   #8 (permalink)
Entwickler

ID: 142585
Lose-Remote

Reg: 05.05.2006
Beiträge: 109
Standard

richtig, sagte ich ja
du musst ja irgendwo zwischenspeichern zu welchem thread du schonmal einen reply ausgelesen hast und zu welchem nicht.


Thema Datenbankprogramierung
Es würde viel mehr bringen auf select * zu verzichten, welche im vsm teilweise noch vorkommen.
auf immer wiederkehrende time(), welche den server unnötig belasten, einmal zwischenspeichern hät es da auch getan.
und darauf immer wieder neue verbindungen zur db aufzubauen anstatt beim connect zu checken ob es noch offene gibt die genutzt werden können
 

Geändert von Caveman (09.12.2006 um 11:35:11 Uhr)
Caveman ist offline  
Alt 09.12.2006, 11:33:54   #9 (permalink)
Erfahrener Benutzer

ID: 118459
Lose-Remote

Reg: 20.04.2006
Beiträge: 4.530
Standard

SELECT id, time FROM replys WHERE id=(SELECT id FROM threads) GROUP BY id

ungetestet.
EDIT: Subquerys gehen aber erst ab MySQL 5. Das müsstest du dann haben

Geändert von flaschenkind (09.12.2006 um 11:34:29 Uhr)
flaschenkind ist offline  
Alt 09.12.2006, 11:41:20   #10 (permalink)
Entwickler

ID: 142585
Lose-Remote

Reg: 05.05.2006
Beiträge: 109
Standard

bei diesen "subquerys" macht der intern ne 2. abfrage, wodurch wir wieder bei 2 abfragen angelangt wären
 
Caveman ist offline  
Alt 09.12.2006, 11:44:25   #11 (permalink)
Erfahrener Benutzer

ID: 99340
Lose-Remote

Reg: 20.04.2006
Beiträge: 1.256
Standard

Zitat:
Zitat von Caveman Beitrag anzeigen
bei diesen "subquerys" macht der intern ne 2. abfrage, wodurch wir wieder bei 2 abfragen angelangt wären
ja wir haben wieder 2 abfragen aber ineinander!

mir geht es darum das ich nicht allzu oftwas an die db schicken muss und nicht allzuoft was zurückkommt und in diesem fall würde ich nur 1 mal was dahinschicken und es würde nur 1 mal zurückkommen!
danke werds gleich ma testen wenn jemand was ohne subquerys hat wäre auch schön!

edit: ne sry hab version 4
 

Geändert von Programmierer (09.12.2006 um 11:46:10 Uhr)
Programmierer ist offline Threadstarter  
Alt 09.12.2006, 11:46:41   #12 (permalink)
Erfahrener Benutzer

ID: 118459
Lose-Remote

Reg: 20.04.2006
Beiträge: 4.530
Standard

Subquerys sind aber immer noch besser für die DB als zwei Querys
flaschenkind ist offline  
Alt 09.12.2006, 11:51:08   #13 (permalink)
Erfahrener Benutzer

ID: 99340
Lose-Remote

Reg: 20.04.2006
Beiträge: 1.256
Standard

Zitat:
Zitat von flaschenkind Beitrag anzeigen
Subquerys sind aber immer noch besser für die DB als zwei Querys
hab die query ma in phpmyadmin ausgeführt und als fehler kam folgendes:
#1242 - Subquery returns more than 1 row

was heißt das?
 
Programmierer ist offline Threadstarter  
Alt 09.12.2006, 11:52:08   #14 (permalink)
Entwickler

ID: 142585
Lose-Remote

Reg: 05.05.2006
Beiträge: 109
Standard

Das heißt das diese subquery mehr als ein ergebnis wirft und es somit so nicht lösbar ist
 
Caveman ist offline  
Alt 09.12.2006, 12:32:35   #15 (permalink)
Erfahrener Benutzer

ID: 99340
Lose-Remote

Reg: 20.04.2006
Beiträge: 1.256
Standard

habs soweit:

SELECT thread.id, reply.time FROM game_ally_forum_thread as thread, game_ally_forum_reply as reply WHERE reply.thread = thread.id GROUP BY id

mein problem ist das nicht die höchste zeit abgerufen wird, sondern einfach eine wilde und 2tens das die threads die keine replys haben auch nicht abgerufen werden!

OK hab nun das hier:

SELECT thread . * , reply . *
FROM game_ally_forum_thread AS thread
LEFT JOIN game_ally_forum_reply AS reply ON thread.id = reply.thread
GROUP BY thread.id
LIMIT 0 , 30

aber leider wird bei time nicht die höchste genommen sondern einfach irgendeine!
 

Geändert von Programmierer (09.12.2006 um 12:40:50 Uhr)
Programmierer ist offline Threadstarter  
 

Gesponsorte Links

Anzeige


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
SQL Abfrage zerberos Programmierung 3 14.07.2008 12:31:21
[SQL] SQL-Abfrage - mindestens... hammi Programmierung 3 21.09.2006 16:24:08
suche pw abfrage für hp bombe Programmierung 6 25.07.2006 23:58:06


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36:35 Uhr.