[MySQL] Probleme mit einer Abfrage

atlan428

Well-known member
ID: 43536
L
13 Mai 2006
269
10
Ich möchte eine Angriffssperre für mein Onlinegame programmieren. Mit dieser Sperre, dürfen nur 3 Angriffe von einem Benutzer auf einen anderen Benutzer erfolgen. Dazu muss ich aber diese Anzahl abfragen. Hier ist mal der SQL-Aufbau.

Table: angriff
Felder: id, angreifer, verteidiger, vnick, anick

Erklärungen
id: Nummer des Angriffs (brauche ich nur für nochher numrows)
angreifer: Nummer der Festung des Angreifers
verteidiger: Nummer der Festungs des Verteidigers
vnick: Nickname vom Verteidiger
anick: Nickname vom Angreifer

Bekannte Werte:
-angreifer
-verteidiger
-anick

Wie kann man daraus ein Query machen, der mir die einzelnen Angriffe ausgibt?
 
Zuletzt bearbeitet:
SELECT COUNT(*) FROM angriffe WHERE angreifer = $_SESSION['spielerid']

Das ganze allerdings noch escapen bzw sichergehen, dass in $_SESSION nur geprüfte Werte drinnenstehen.

Oder du machst das ganze mit mysql_num_rows().
 
Nein, dass funktioniert leider nicht. Auf die Idee wäre ich auch gekommen. Das Problem ist, dass der Angreifer auch verschiedene Festungen haben kann. Die Festung muss nicht immer die gleiche sein, genauso wie beim Verteidiger.
 
Johnson schrieb:
SELECT COUNT(*) FROM angriffe WHERE angreifer = $_SESSION['spielerid']

+

Entweder jetzt noch ein verteidiger = ... in die WHERE-Klausel mit rein, wenn es um einen bestimmten Verteidiger geht (sehr wahrscheinlich). Oder ein GROUP BY verteidiger... (eher unwahrscheinlich, dass du das brauchst).
 
atlan428 schrieb:
Nein, dass funktioniert leider nicht. Auf die Idee wäre ich auch gekommen. Das Problem ist, dass der Angreifer auch verschiedene Festungen haben kann. Die Festung muss nicht immer die gleiche sein, genauso wie beim Verteidiger.

Achso, du meinst einen spezifischen Benutzer ?

Dann sollte das ganze wie happymaster schon geschrieben hat mit GROUP BY bzw einer erweiterten Condition hinzubekommen sein.
 
lass das doch alles mysql die angriffe zählen. Die frage ist, kann ein benutzer mehrere Festungen haben? wenn ja nach nick einschränken, wenn nein nach der festungsid. ggf musste halt den besitzer der verteidigenden festund rausfinden (am besten mit nem JOIN)
Beispiel:
SELECT COUNT(*) FROM angriff WHERE anick=angreifer AND vnick=verteidiger
wenn das schon 3 ist geht kein angriff mehr. Wenn du die bereits laufenden angriffe mit auflisten willst machts natürlich keinen sinn.
 
dann kommst du um nen join nich drumrum.. wenns mehrere festungen gibt brauchst du die besitzer dazu...
 
Nur mit dem JOIN-Befehl kenne ich mich nicht aus.

Eine andere Möglichkeit wäre es, wenn ich vorher die Festungsnummer zu den Nicknamen zuordne und dann noch eine Abfrage mache.
 
atlan428 schrieb:
@ happymaster

Der vname ist ja nicht bekannt!

Wozu sollte man den wissen müssen - wenn jeder Verteidiger eine ID (eindeutige Ganzzahl will ich es mal nennen), geht das auch so.

Edit-Edit: verteidiger: Nummer der Festungs des Verteidigers.. okay das erklärt das... dann machst du halt ein GROUP BY / WHERE mit vnick!

Edit-Edit-Edit: Noch ein Kommentar dazu.. es ist imho denkbar ungünstig mit User-Nicknames zu arbeiten, wenn es nicht gerade um die User-Tabelle geht. Ansonsten sollte jeder User eine ID haben und dann kann man mit der als Fremdschlüssel in anderen Tabellen arbeiten!

Edit:

Grinch schrieb:
dann kommst du um nen join nich drumrum.. wenns mehrere festungen gibt brauchst du die besitzer dazu...

Denke ich dann auch, wobei mir der Durchblick fehlt. Wenn du schon die Angreifer-Tabelle postest und bestimmte Angriffe haben willst? o__Ö
 
Zuletzt bearbeitet:
theoretisch geht das schon, praktisch geht nen JOIN unendlichmal schneller und bequemer..
ich schätze mal du hast ne tabelle festungen mit festungsnummer, besitzer und sonst was.. also wäre die abfrage:
SELECT COUNT(*) FROM angriff INNER JOIN festung ON angriff.verteidiger = festung.festungsnummer WHERE anick=angreifername AND festung.besitzername=vnick;

so oder so ähnlich

am besten ist du legst mal die struktur der entsprechenden tabellen offen, dann kann mans genau sagen ;)
 
Mit einem SELECT * FROM angriff WHERE anick=$_SESSION['spielerid'] solltest doch alle Angriffe eines Spielers haben.
Da noch ein kleines COUNT und GROUP BY verteidiger mit reingebastelt und schon haste alles, was du brauchst.

anddie
 
anddie schrieb:
Mit einem SELECT * FROM angriff WHERE anick=$_SESSION['spielerid'] solltest doch alle Angriffe eines Spielers haben.
Da noch ein kleines COUNT und GROUP BY verteidiger mit reingebastelt und schon haste alles, was du brauchst.

anddie
Ne, weil verteidiger nur die id der einen Festung ist, ein Spieler aber mehrere Festungen haben kann. Deshalb brauchste ja den Besitzer der Festung und musst zählen wieviele Angriffe vom Angreifer auf den Verteidiger laufen.
 
Dann halt mit vname.
Dachte es sind nur 3 Angriffe pro Angreifer auf 1 Festung erlaubt.

anddie
 
vname hat er aber nicht :) deswegen muss man den ja auch via JOIN holen..

also ich vermute einfach mal dass es folgendermaßen ablaufen soll:
Spieler "abc" will von seiner festung 4711 einen angriff auf die festung 0815 starten. jetzt soll halt geprüft werden ob der angreifer schon 3 angriffe auf den besitzer von 0815 laufen hat. Dazu kann man entweder mit einem query den besitzer rausfinden und dann mit where vnick einschränken, oder man packt es eben in einen query in dem man die angriff mit der festungstabelle joined...