Anzahl Nickname in Zeilen

suicidus

Fuuuuu
ID: 314529
L
13 Mai 2009
766
92
Ich nochmal, mit einem letzten Problem, diesmal auch nicht übernächtigt :mrgreen:

Also ich habe in meiner Tabelle die Zeile "eingeloest". Dort werden pro Zeile jedesmal Nicknames mit Komma gespeichert, z.B. suicidus, oma, opa, mama usw.

Die Tabelle ist so aufgebaut.

|-Gutschein-| |-eingeloest-|
Gutschein1 suicidus, oma, papa
Gutschein2 suicidus, mama

Ich bräuchte einen Zähler auf meiner Seite, der angibt, wie oft der jeweilige Nick des eingeloggten Users in der ganzen Tabellenreihe vorkommt.

Das ganze ist für das VMS2. Der Nick wird mit $_SESSION['nickname'] ausgelesen. Hoffe da kann mir jemand helfen, dann bin ich nämlich fertig.
 
Ich würde die Tabelle erstmal normalisieren. Du hast ja nicht mal 1NF 8O Logisch, dass du dir da die Zähne ausbeißt.
 
Ok jetzt bin ich auch verwirrt. Was meinst du mit 1NF? Ich kenn mich nicht gut aus mit der Marterie. Komm da grad so durch.
 
Mit Verlaub, wenn du dich nicht so auskennst, solltest du dich erstmal kundig machen, bevor du ans Werk gehst.

1NF = 1. Normalform, d.h. alle Attribute der Relation enthalten nur atomare Werte.

Wenn du in eine Spalte mehrere durch Kommata getrennte Werte einfügst, so hast du keine 1NF und in Folge dessen auch die Probleme, mit denen du grade zu kämpfen hast, dass du nicht rankommst an die Daten.

Normalisiere deine Tabelle also erstmal. Der Wikipedia-Artikel zeigt dir das schön an Hand eines Beispiels.
 
Normalform für Datenbank kannst Du hier nachlesen und das SQL für Deinen Fall sollte sein:
PHP:
mysql_query("SELECT COUNT(*) FROM `tabelle` WHERE `eingeloest` LIKE " . mysql_real_escape_string("%" . $_SESSION['username'] . "%");

Aber les Dir das mit den NF lieber mal durch wie theHacker schon sagte, das ist sehr Systemlastig, vorallem wenn, was ich vermute oft abgefragt werden muss.

*edit
Jetzt haut mir theHacker bistimmt auf´n S****:roll:
 
und das SQL für Deinen Fall sollte sein:
PHP:
mysql_query("SELECT COUNT(*) FROM `tabelle` WHERE `username` LIKE " . mysql_real_escape_string("%" . $_SESSION['username'] . "%");

Und dann heißt einer k123 und der andere k1234 und k123 wird gleich einmal mehr gefunden ;)
Wenn man das wirklich so "dreckig" lösen will jeden Namen umgeben von Trennzeichen (z.B. |), welche allerdings nicht im Namen vorkommen können/dürfen, abspeichern und dann das nach bzw. vor den %-Zeichen ;)
 
Jetzt haut mir theHacker bistimmt auf´n S****:roll:
Das hat chrissel schon ;)
Wenn man das wirklich so "dreckig" lösen will jeden Namen umgeben von Trennzeichen (z.B. |), welche allerdings nicht im Namen vorkommen können/dürfen, abspeichern und dann das nach bzw. vor den %-Zeichen ;)
Und selbst dann gibts immer noch Probleme, wenn mehrere "Teilwerte" ausgelesen/verarbeitet werden müssen. Dann darfstde die dirty Delimiter mit PHP von Hand rausparsen und die ganze Tabelle im Speicher halten.
PHP freut sich... und der "Programmierer" noch mehr, wenn der Hoster dann den Prozess wegen OutOfMemory abschießt und gar nix mehr geht :LOL:
 
Ich weiß jetzt nicht ob ich mich gerade täusche, aber ich meine mal gelesen zu haben, dass:
Code:
 SELECT COUNT(*) ...
nicht benutzt werden sollte.

Lieber:
Code:
 Select count('id')
Also meinen einem Spaltennamen.

Hintergrund an der ganzen Sache war, dass mit * alle Spalten genommen werden. Sollte die Tabelle aus irgendeinem Grund erweitert werden, lädst du viel zu viele Daten aus der Datenbank.

Falls ich mich jetzt gerade täusche, dann tut es mir leid und ich bin zu belehrung bereit.

Grüße
Don
 
Falls ich mich jetzt gerade täusche, dann tut es mir leid und ich bin zu belehrung bereit.
Dann lass dich mal belehren:
https://dev.mysql.com/doc/refman/5.1/en/counting-rows.html
https://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count

COUNT(*) zählt alle Spalten inklusive NULL-Zeilen. COUNT(col) zählt die Anzahl der nicht-NULL-Zeilen in col.

Sind also zwei völlig unterschiedliche Dinge und können nicht gegenseitig ausgetauscht werden.
Code:
count('id')
ist vollkommener Nonsense und mit COUNT(*) äquivalent.
Hintergrund an der ganzen Sache war, dass mit * alle Spalten genommen werden. Sollte die Tabelle aus irgendeinem Grund erweitert werden, lädst du viel zu viele Daten aus der Datenbank.
Ein COUNT lädt gar nichts, sondern - wie man sich schon denken kann - zählt einfach nur. Ich vermute (warte auf ice-breaker :mrgreen:), dass das sogar eine O(1)-Operation is.
 
Ein COUNT lädt gar nichts, sondern - wie man sich schon denken kann - zählt einfach nur. Ich vermute (warte auf ice-breaker :mrgreen:), dass das sogar eine O(1)-Operation is.
*gg*
es sollte ein Tag geben mit dem man Nutzer referenzieren kann :D
@ice-breaker wie in Twitter.
Du liegst richtig ;)

Von ice hab ich irgendwo schon gelesen (wenn ich mich recht erinnere, mal sehen ob ichs noch finde).
ich sollte nen Index über meine DB-Posts machen :biggrin:

Bei MyISAM schon, InnoDB macht nen Full-Table-Scan (Link).
Full-Table-Scan ist nicht ganz korrekt ;)
Da InnoDB-Tabellen immer einen PrimaryKey haben (wenn man manuell keinen erstellt, erzeugt InnoDB einen unsichtbaren) findet ein Index-Scan auf dem PK statt.

Jo, MyISAM cacht die Anzahl Zeilen (oder updated den Zähler bei jedem bearbeiten, bin mir nicht ganz sicher) und InnoDB zählt die jedes Mal.
Es ist ein Zähler ;) Die Anzahl der Zeilen werden in den MyISAM-Metadata aufgehoben.
Bei InnoDB ist dies nicht so einfach realisierbar, da man mit Transaktionen ja verschiedene Sichtweisen auf die Daten hat und somit jede Transaktion eine unterschiedliche Anzahl an Zeilen haben kann, wird es momentan einfach immer neu gezählt.
Es gibt zwar Lösungsansätze, wie man dies nicht machen müsste, aber die sind relativ aufwendig, von daher ist es für Projekte die ein COUNT() auf InnoDB brauchen viel einfacher selbst einen Zähler zu implementieren.