Archiv für die Kategorie ‘MySQL Tipps’

MySQL – nach einer Abfrage betroffene Datensätze mit PHP ermitteln

Donnerstag, 22. März 2012

Im Gegensatz zu SELECT MySQL Abfragen, wo Sie nach einer Abfrage eine Sammlung von Datensätzen bekommen und ganz genau wissen wie viele diese sind, wissen Sie das bei UPDATE und DELETE Abfragen nicht direkt. Manchmal möchten Sie anhand der Anzahl der betroffenen Datensätze einer UPDATE oder DELETE MySQL Abfrage wissen, ob Sie die Abfrage richtig ausgeführt hatten. Dafür gibt es eine spezielle Funktion von PHP, die Ihnen hilft die betroffenen Datensätze zu zählen und zu interpretieren.

Aufgabe – Ermittlung der betroffenen Datensätze nach einer MySQL Abfrage mit PHP

Um das zu tun, müssen Sie unmittelbar nach Ihrer UPDATE oder DELETE MySQL Abfrage, folgende PHP Funktion aufrufen:

echo mysql_affected_rows();

Ausgedruckt wird die Anzahl der betroffenen Datensätze und nun können Sie diese Information Ihren Besuchern zeigen oder diese interpretieren um weitere Schritte vorzunehmen.

Läuft nicht so, wie Sie es sich vorstellen? Dann melden Sie sich bei uns, wir helfen gerne weiter.

MySQL Spalten und Tabellen mit Sonderzeichen und Umlaute

Dienstag, 20. März 2012

Auch wenn Sie ein MySQL Profi sind, werden Sie zu einer bestimmten Zeit MySQL Spalten- und Tabellennamen mit Sonderzeichen anlegen wollen oder müssen. Das gilt auch für den Fall, wenn Ihre MySQL Tabelle oder Spalte ein durch MySQL reserviertes Wort enthält oder wenn Sie Ihre User direkt die Tabellenerstellung über eine Schnittstelle überlassen. Wichtig zu wissen ist, dass dies am besten umzugehen jedoch nicht unmöglich ist – Sie können ohne Probleme Sonderzeichen und Umlaute in Ihren MySQL Tabellennamen und Spaltennamen anwenden, wenn Sie sich einfach an die Spielregeln halten was die korrekte Schreibweise Ihrer MySQL Abfragen angeht.

Problematik mit Sonderzeichen und Umlauten in MySQL Tabellen und Spalten

Angenommen, Sie hätten die MySQL Tabelle Haus-Benutzer. Folgende Abfrage:

SELECT * FROM Haus-Benutzer

würde direkt scheitern, da der Bindestrich innerhalb der Abfrage anders interpretiert wird. Auch eine solche Abfrage:

SELECT * FROM Gewünschte Farbe

oder

 SELECT * FROM Release 

ist ungültig. Das Leerzeichen bringt die Abfrage durch einander, an dieser Stelle wird als Tabellenname ‘Gewünschte’ betrachtet. ‘Release’ ist ein durch MySQL reserviertes Wort.

Lösung – korrekte MySQL Schreibweise für Sonderzeichen, Bindestriche und Umlaute

Die allgemeine Lösung ist die Nutzung von einem Sonderapostrophen – `. Die Umfassung von Spalten und Tabellen, egal wo diese in der Abfrage vorkommen, ist eine Voraussetzung für problemlose Abfragenergebnisse und sagt dem MySQL Engine, dass an dieser Stelle genau eine Tabelle oder Spalte gemeint ist. Eine korrekte Abfrage kann so aussehen:

SELECT * FROM `Gewünschte Farbe` WHERE `Release`='ja' AND `Präzision`>1 ORDER BY `Präzision`

Bitte, betrachten Sie die Nutzung von ` auch in dem Order Klausel, wo auch Spaltennamen angesprochen werden können, die ggf. genauso auskommentiert werden sollen. Wir empfehlen dringend bei Ihrer PHP Programmierung dieses Zeichen bei der dynamischen Generierung Ihrer MySQL Abfrage zu intergrieren. Dies ist auch use-media Programmierstandard.

Noch Fragen? Wir stehen gerne zur Verfügung.

MySQL gruppierte/ausgeblendete Datensätze nach Gruppierung beibehalten mit GROUP_CONCAT

Donnerstag, 17. November 2011

Haben Sie sich die Frage gestellt – Wir gruppieren mit MySQL und was passiert mit den ganzen Werten, die in Spalten stehen, nach denen wir nicht gruppieren? Diese werden unter Umständen einfach durch die GROUP BY Klausel ausgeblendet. Manchmal möchten wir Sie aber behalten und sogar in einer bestimmten Reihenfolge. Anbei eine Erklärung, wie wir Werte von einer Gruppieren beibehalten können – mit MySQL Programmierung und die Funktion GROUP_CONCAT.

Ausgangsbasis

Wir haben folgende Tabelle:

ID    Zimmer         BesucherID
1       100             1
2       101             1
3       105             2

Wenn wir folgenden Befehl ausführen, um nach BesucherID mit MySQL GROUP BY zu gruppieren, so führen wir folgende Abfrage aus:

SELECT COUNT(*) as cnt, Zimmer, BesucherID FROM Tabelle GROUP BY BesucherID

Wir bekommen daraufhin einen solchen Ergebnis:

cnt    Zimmer BesucherID
2        100         1
1        105         1

Was passiert aber mit sämtlichen Zimmerangaben? Hier bekommen wir einen zufälligen Wert, der sich auf die BesucherID bezieht.

Problemstellung

Nach Gruppierung mit MySQL möchten wir ggf. ausgeblendete Daten beibehalten und nicht nur per Random einen zufälligen Wert geliefert bekommen, wenn wir die Spalte selektieren.

Lösung

MySQL bietet die schöne Funktion GROUP_CONCAT, mit denen wir alle durch die Gruppierung ausgeblendeten Werte pro Spalte erhalten können. So lautet die Abfrage:

SELECT COUNT(*) as cnt, GROUP_CONCAT(Zimmer), BesucherID FROM Tabelle GROUP BY BesucherID

Hierbei bekommen wir folgendes Ergebnis:

cnt     Zimmer       BesucherID
2         100,101      1
1          105            1

Diese Funktion ist sehr nützlich, insbesondere wenn Sie durch die Gruppierung MIN oder MAX Werte suchen und Ihre korrespondierende Angaben direkt sehen wollen. Genau das zu tun, können Sie auch die Reihenfolge der Werte bestimmen, die durch GROUP_CONCAT in einer kommagetrennte Liste gezählt werden. So wird das gemacht mit GROUP_CONCAT und ORDER BY:

SELECT COUNT(*) as cnt, GROUP_CONCAT(Zimmer ORDER BY BesucherID), BesucherID FROM Tabelle GROUP BY BesucherID

Fazit

Wir hoffen, dass Sie sich mit dieser Funktion einige Zeit sparen konnten. Falls Ihnen der Beitrag gefällt, so nutzen Sie bitte den Gefällt mir Facebook Button.
Brauchen Sie Hilfe, kommen Sie nicht weiter? Wir stehen Ihnen zur Verfügung – 02161 / 177747 oder E-Mail.

Zeichenketten oder Felderwerte mit MySQL CONCAT verknüpfen/verketten

Mittwoch, 02. November 2011

MySQL ist eine mächtige Sprache, die sehr oft PHP Programmierern sehr viel Arbeit abnehmen kann. Dies gilt für diverse Berechnungen, die manchmal mit PHP langsamer erledigt werden können, denn es sind weitere Programmierschritte notwendig. Heute werden wir betrachten wir verschiedene MySQL Felderwerte mit weiteren Feldern oder Zeichenketten verknüpft werden können. Dies hilft uns direkte und fertige Werte für unsere PHP Programmierung bereit zu halten oder diverse Sortier- oder Gruppieraktionen durchzuführen.

Problematik

Betrachten wir eine MySQL Tabelle USERS mit folgenden Feldern: ID, Vorname, Nachname. Nun sehen wir wie wir einen kompletten Namen direkt von MySQL erhalten können.

Lösung

SELECT CONCAT(Vorname,Nachname) as Vollname FROM USERS ORDER BY Vollname

Wir haben soeben mit MySQL die Tabelle so abgefragt, dass wir ein Ergebnis mit lediglich einer Spalte bekommen – Vollname. Diese Spalte würde für Werte Thomas und Müller folgenden Wert enthalten – ThomasMüller. Dies ist aber kein korrektes Format, in diesem Fall für einen Namen. Nun können wir die Abfrage so erweitern:

SELECT CONCAT(Vorname,' ',Nachname) as Vollname FROM USERS ORDER BY Vollname

Wir haben eine Zeichenkette noch dazu durch MySQL verknüpfen lassen. Hiermit bekämen wir Thomas Müller.

Fazit

Es gibt zwei sehr interessante und nützliche Aspekte zu diesem Thema:

  • Sie können so viele Felder und/oder Zeichenketten verbinden, wie Sie wollen
  • Sie können beliebige Trenn- oder andere Zeichen verketten. Diese müssen Sie einfach mit einem Komma trennen

Brauchen Sie professionelle Hilfe für Ihre Programmierungen oder MySQL Abfragen? Wir sind für Sie da – zögern Sie nicht mit uns per E-Mail oder telefonisch – 02161 / 177747 – Kontakt aufzunehmen.

Ermitteln vom nächsten AutoIndex Wert einer MySQL Tabelle mit auto_increment Feldern

Dienstag, 25. Januar 2011

Wie wir schon bei unserem letzten sich über MySQL beziehenden Artikel MySQL – nächster AutoIndex zurücksetzen/resetten erläutert haben, ist der AutoIndex ganz wichtig wenn man oft Datensätzen einfügt und dann wieder löscht, denn MySQL lässt keine Werte in auto_increment Felder wieder vorkommen, es sei denn man setzt den AutoIndex-Wert auf den kleinstmöglichen Wert zurück. Der minimale Wert kann ja in der Regel die größte momentan vergebene auto_increment ID + 1. Die Lösung die wir hier in diesem Artikel betrachten werden, bezieht sich darauf wie man den nächsten zu vergebenden auto_increment Wert abrufen kann.

Problemstellung

Wir sind über das Problem gestolpert, als es für uns wichtig wurde, die IDs von Datensätzen vor dem Einfügen zu ermitteln. Dies könnte dazu dienen, beispielsweise in einer Buchhaltungsroutine, eingegebene Kassenbelege mit IDs in einer Datenbank zu verknüpfen, um später Kassenbestände eindeutig identifizieren zu können, insbesondere wenn man die Kasse elektronisch aufführen möchte. Hierzu kommt MySQL mit einer Abfrage zur Hilfe.

Lösung

Um den nächsten AutoIndex Wert zu bekommen, müsste man folgende Abfrage ausführen:

SHOW TABLE STATUS LIKE `IhreTabelle`

Zurückgegeben von MySQL (natürlich bei existierender mit diesem Namen Tabelle) wird eine Zeile mit vielen Werten, die unter anderem Kollation, Kodierung, Datum der letzten Änderung und sonstige beinhaltet. Was wir hier auslesen müssen ist der Wert in der Spalte Auto_increment, die unseren Wert beinhaltet. Diesen können Sie beispielsweise mit PHP einfach auslesen. Wenn Sie da nicht selber weiterkommen, so können Sie sich mit uns in Verbindung setzen.use-web

Problematik

Natürlich gibt es verschiedene Punkte, die man berücksichtigen muss:

  • Häufige Tabellennutzung – falls die Tabelle, wo Sie Ihre Datensätze einfügen von mehreren (beispielsweise Buchhaltern) benutzt wird, so kann es sein, dass sich der nächste AutoIndex ändert nachdem Sie die Ausgabe von der obigen Abfrage sehen und bevor Sie auf Speichern klicken, denn diese ID könnte jemandem anders schon vergeben worden sein.
  • Syntax der Abfrage – vergessen Sie nie den Tabellennamen in den Apostrophen zu umfassen – ` … `, denn ansonsten wird ein Tabellennamen mit Bindestrich nicht angenommen
  • Unnötiggröße Werte – vergessen Sie nie den AutoIndex zurückzusetzten immer, wenn Sie eine Gelegenheit haben, um nicht eine Felddefinitionsgrenze nicht zu erreichen. Dies haben haben wir in unserem anderen Artikel beschrieben.

 Bei Fragen stehen wir Ihnen jederzeit zur Verfügung. Viel Spass und beachten Sie bitte unsere anderen MySQL Artikel!