SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Webseiten professionell erstellen

Webseiten professionell erstellen zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)
Hilfe Community Kalender Heutige Beiträge Suchen

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 28.07.2009, 15:18:48
I-c-H I-c-H ist offline
Anfänger
 
Registriert seit: Jul 2009
Alter: 32
Beiträge: 9
UDF für eine ganze Spalte und alle Zeilen

Hallo Selfer,

ich hab Big Google, Yahoo und auch Bing rauf und runter befragt, doch keiner weiß so Recht eine Antwort.

Ist es möglich eine Funktion zu schreiben, die ALLE Zeilen einer (oder mehrerer) Spalte(n) bearbeitet? Wenn ja, wie?

Ich möchte so zum Beispiel On The Fly bestimmte Berechnungen durchführen.
Ich würde mich, wenn's sein muss, auch damit zufriedengeben, wenn diese Funktion nur eine Zeile zurückgeben kann.

MySQL-Funktionen wie COUNT(*) kriegt das ja auch irgendwie gebacken.

Danke für jede Hilfe!

Gruß
Mit Zitat antworten
  #2  
Alt 28.07.2009, 16:28:29
Benutzerbild von vt1816
vt1816 vt1816 ist offline
Administrator
 
Registriert seit: Jul 2004
Beiträge: 3.707
AW: UDF für eine ganze Spalte und alle Zeilen

Hallo und willkommen hier im Forum.

Hast Du es mal mit dem MySQL-Handbuch versucht?
Und die Funktion mit ein wenig PHP-Code zu verkleiden sollte dann auch kein Problem mehr darstellen - oder?
__________________
Gruss vt1816
Erwarte nicht, dass sich jemand mehr Mühe mit der Antwort gibt als Du Dir mit der Frage.
. . . . . Feedback wäre wünschenswert

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, WhatsApp, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #3  
Alt 28.07.2009, 17:26:02
I-c-H I-c-H ist offline
Anfänger
 
Registriert seit: Jul 2009
Alter: 32
Beiträge: 9
AW: UDF für eine ganze Spalte und alle Zeilen

Ja, habe ich.
Leider kann ich da aber keinen Hinweis auf einen Lösungsansatz finden.
Die dort beschriebene Prozedur geht von zwei konstanten Werten aus.

Also entweder von

Funktion(string1, string2)

oder

Funktion(Subquery, string2)

- der Subquery darf seinerseits aber auch nur EIN Argument liefern, ansonsten erscheint eine Fehlermeldung, dass zu viele Argumente vorhanden wären.

Gruß
Mit Zitat antworten
  #4  
Alt 28.07.2009, 18:16:11
Benutzerbild von vt1816
vt1816 vt1816 ist offline
Administrator
 
Registriert seit: Jul 2004
Beiträge: 3.707
AW: UDF für eine ganze Spalte und alle Zeilen

Zitat:
Zitat von I-c-H Beitrag anzeigen
[...]
Die dort beschriebene Prozedur geht von zwei konstanten Werten aus.

Wo steht hier was von nur zwei Argumenten?
Zitat:
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 ...]
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
__________________
Gruss vt1816
Erwarte nicht, dass sich jemand mehr Mühe mit der Antwort gibt als Du Dir mit der Frage.
. . . . . Feedback wäre wünschenswert

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, WhatsApp, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #5  
Alt 28.07.2009, 18:36:20
I-c-H I-c-H ist offline
Anfänger
 
Registriert seit: Jul 2009
Alter: 32
Beiträge: 9
AW: UDF für eine ganze Spalte und alle Zeilen

Ich glaube du hast mich falsch verstanden.
Ich ändere das Beispiel noch mal:

Zitat:
returnSomething(ARGUMENT1, ARGUMENT2)

oder

returnSomething(Subquery, ARGUMENT2)
der SUBQUERY darf aber nur EIN Argument zurückliefern, ansonsten erscheint eine Fehlermeldung.


Fallbeispiel (nicht ganz sinnig, aber egal):
returnSomething(Argument1, Argument2) gibt alle Buchstaben aus Argument 2 aus, die nicht in Argument 1 vorhanden sind.

Diese Funktion arbeitet auch völlig korrekt, wenn ich sie so anwende:

Code:
SELECT returnSomething('Otto', 'Otti')
Ausgabe: i

Sie funktioniert auch, wenn:
Code:
returnSomething((SELECT `spalte` FROM `table` WHERE ID = 5), 'Otti')
Sie funktioniert aber nicht, wenn der Subquery mehrere Argumente zurückliefert.

Code:
SELECT returnSomething((SELECT `spalte` FROM `table` WHERE `name` LIKE (%O%)), 'Otti')
In diesem Beispiel würde ich z.B. eine Ergebnisliste für jede Zeile von `table` generieren wollen. Diese Liste enthält dann alle die Buchstaben von 'Otti', die nicht in der aktuellen Zeile von `spalte`stehen.

PROBLEM:
Wie arbeite ich mit einem Subquery der mehr als ein Argument enthält?
Oder alternativ: Wie ließe sich das sonst noch (in MySQL) umsetzen?
Mit Zitat antworten
  #6  
Alt 28.07.2009, 18:59:38
Benutzerbild von vt1816
vt1816 vt1816 ist offline
Administrator
 
Registriert seit: Jul 2004
Beiträge: 3.707
AW: UDF für eine ganze Spalte und alle Zeilen

Zitat:
Zitat von I-c-H Beitrag anzeigen
Ich glaube du hast mich falsch verstanden.
[...]
Da könntest Du Recht haben.

Denn auch das
Zitat:
Zitat von I-c-H Beitrag anzeigen
Code:
SELECT returnSomething('Otto', 'Otti')
Ausgabe: i
verstehe ich nicht.

Wie möchtest Du den Rückgabewert einer Funktion als zu selektierendes Feld einbinden - zumal Du hier mit einem Rückgabewertbeispiel
Zitat:
Zitat von I-c-H Beitrag anzeigen
Diese Liste enthält dann alle die Buchstaben von 'Otti', die nicht in der aktuellen Zeile von `spalte`stehen.
von einzelnen Buchstaben sprichst.

Möchtest Du die Rückgabewerte nicht eher in der WHERE-Klausel verwenden? Bist Du sicher was Du willst?
__________________
Gruss vt1816
Erwarte nicht, dass sich jemand mehr Mühe mit der Antwort gibt als Du Dir mit der Frage.
. . . . . Feedback wäre wünschenswert

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, WhatsApp, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #7  
Alt 28.07.2009, 19:41:20
I-c-H I-c-H ist offline
Anfänger
 
Registriert seit: Jul 2009
Alter: 32
Beiträge: 9
AW: UDF für eine ganze Spalte und alle Zeilen

Die Funktion returnSomething(Argument1, Argument2) gibt irgendetwas zurück.

Machen wir's noch einfacher (warum nicht gleich so? :) )

returnSomething addiert die beiden Argumente miteinander.

Ich habe eine Tabelle "Zahlen":
ID, Wert
1 12
2 15
3 18
4 21
5 24


Code:
SELECT returnSomething((SELECT `wert` FROM `Zahlen`), 5) AS Summe
Die Rückgabewerte werden nun für jede Zeile einzeln aufgelistet:

Summe
17
20
23
26
29

Da der Subquery
Code:
(SELECT `wert` FROM `Zahlen`)
aber mehr als ein Argument (mehr als eine Zeile) zurückliefert, erhalte ich eine Warnung und keine Liste (wie gewünscht).

Folgender Subquery würde nur ein Argument zurückliefern und funktionieren:
Code:
(SELECT `wert` FROM `Zahlen` WHERE ID = 2)
Der Rückgabewert von returnSomething:
Summe
20
Mit Zitat antworten
  #8  
Alt 28.07.2009, 19:52:48
Benutzerbild von vt1816
vt1816 vt1816 ist offline
Administrator
 
Registriert seit: Jul 2004
Beiträge: 3.707
AW: UDF für eine ganze Spalte und alle Zeilen

Solange Du nicht verstehst/verstehen möchtest, dass das hier
Zitat:
Zitat von I-c-H Beitrag anzeigen
[...]
Code:
SELECT returnSomething((SELECT `wert` FROM `Zahlen`), 5) AS Summe
Mist (mir fällt kein anderes jugendfreies Wort ein) ist, werden wir nicht voran kommen.
Denn selbst wenn - so wie Du es möchtest - Deine Funktion nur einen Wert zurück gibt, würde das Ergebnis wie - zum Beispiel - folgt aussehen:

Code:
SELECT 20 AS Summe FROM table WHERE bedingung ORDER BY ... ASC
Und das ist nun mal M...

Vlt. wäre es besser Du outest Deinen Code und die daraus resultierende Fehlermeldung(en) hier - dann sehen wir weiter.
__________________
Gruss vt1816
Erwarte nicht, dass sich jemand mehr Mühe mit der Antwort gibt als Du Dir mit der Frage.
. . . . . Feedback wäre wünschenswert

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.
Ansosnten gilt: Hilfe ausserhalb dieses Thread (PN, WhatsApp, Skype, Mail, ICQ, etc...) nur per Barzahlung oder Vorauskasse!

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #9  
Alt 28.07.2009, 20:08:04
I-c-H I-c-H ist offline
Anfänger
 
Registriert seit: Jul 2009
Alter: 32
Beiträge: 9
AW: UDF für eine ganze Spalte und alle Zeilen

Zitat:
Denn selbst wenn - so wie Du es möchtest - Deine Funktion nur einen Wert zurück gibt, würde das Ergebnis wie
Ich möchte genau dieses Verhalten NICHT haben. Ich möchte, dass die Ergebnisliste mit mehreren Ergebnissen zurückgegeben wird.
Summe
17
20
23
26
29

Du kannst ja mal eine Datenbank anlegen.
DB: Test

Code:
CREATE DATABASE  `test` ;
Und dann erstellst du eine Tabelle
Code:
CREATE TABLE  `test`.`testworte` (
`ID` INT NOT NULL ,
`Worte` VARCHAR( 50 ) NOT NULL ,
PRIMARY KEY (  `ID` )
) ENGINE = MYISAM
Anschließend befüllen wir die mal mit Testwerten:
Code:
INSERT INTO  `test`.`testworte` (
`ID` ,
`Worte`
)
VALUES (
'1',  'automatik'
), (
'2',  'automotor'
);
Dann spielen wir die Levenshtein-Funktion für die Datenbank ein
Code:
DELIMITER //
CREATE FUNCTION LEVENSHTEIN (s1 VARCHAR(255), s2 VARCHAR(255))
  RETURNS INT
    DETERMINISTIC
      BEGIN
        DECLARE s1_len, s2_len, i, j, c, c_temp, cost INT;
        DECLARE s1_char CHAR;
        DECLARE cv0, cv1 VARBINARY(256);
        SET s1_len = CHAR_LENGTH(s1), s2_len = CHAR_LENGTH(s2), cv1 = 0x00, j = 1, i = 1, c = 0;
        IF s1 = s2 THEN
          RETURN 0;
        ELSEIF s1_len = 0 THEN
          RETURN s2_len;
        ELSEIF s2_len = 0 THEN
          RETURN s1_len;
        ELSE
          WHILE j <= s2_len DO
            SET cv1 = CONCAT(cv1, UNHEX(HEX(j))), j = j + 1;
          END WHILE;
          WHILE i <= s1_len DO
            SET s1_char = SUBSTRING(s1, i, 1), c = i, cv0 = UNHEX(HEX(i)), j = 1;
            WHILE j <= s2_len DO
                SET c = c + 1;
                IF s1_char = SUBSTRING(s2, j, 1) THEN SET cost = 0; ELSE SET cost = 1; END IF;
                SET c_temp = CONV(HEX(SUBSTRING(cv1, j, 1)), 16, 10) + cost;
                IF c > c_temp THEN SET c = c_temp; END IF;
                SET c_temp = CONV(HEX(SUBSTRING(cv1, j+1, 1)), 16, 10) + 1;
                IF c > c_temp THEN SET c = c_temp; END IF;
                SET cv0 = CONCAT(cv0, UNHEX(HEX(c))), j = j + 1;
            END WHILE;
            SET cv1 = cv0, i = i + 1;
          END WHILE;
        END IF;
        RETURN c;
      END
//
Dann machst Du folgendes

Code:
SELECT LEVENSHTEIN('autos', 'auto') AS Ergebnis
Du wirst eine Zeile zurückerhalten mit dem Ergebnis 1.

Als nächstes probierst Du mal

Code:
SELECT LEVENSHTEIN((SELECT `worte` FROM `testworte` WHERE ID = 2), 'auto') AS Ergebnis
Und dann probiers mal so:
Code:
SELECT LEVENSHTEIN((SELECT `worte` FROM `testworte`), 'auto') AS Ergebnis
Ich möchte jetzt zwei Ergebniszeilen haben. Stattdessen erhalte ich die Fehlermeldung, dass der Subquery mehr als 1 Argument zurückliefert.

Probiers mal aus - ich weiß was Du meinst, aber das will ich nicht.

Ziel ist es auf diese Weise eine Liste ähnlicher Worte zu generieren, z.B. so
Code:
SELECT worte 
FROM testworte 
WHERE LEAST(
         SELECT LEVENSHTEIN
                (
                 (SELECT `worte` FROM `testworte` WHERE ID = 2), 'auto'
                  ) AS Ergebnis)

Geändert von I-c-H (28.07.2009 um 20:44:59 Uhr)
Mit Zitat antworten
  #10  
Alt 28.07.2009, 21:09:38
feuervogel feuervogel ist offline
SELFPHP Guru
 
Registriert seit: Jan 2004
Ort: Leipzig
Beiträge: 4.549
AW: UDF für eine ganze Spalte und alle Zeilen

also entweder du veränderst deine levenshtein-funktion, so dass sie als erstes argument ein queryset annimmt, und iterierst dann über alle elemente oder aber du baust die iteration in dein statement ein...vielleicht so:

SELECT LEVENSHTEIN(worte, 'auto') AS Ergebnis, worte from test.testworte order by Ergebnis ASC;

Geändert von feuervogel (28.07.2009 um 21:12:12 Uhr)
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

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 aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Load data infile / insert (problem bei einer spalte) tob1 MySQLi/PDO/(MySQL) 1 02.06.2009 07:38:45
Einzelne Spalte per phpmyadmin in neue Tabelle? bart_the1st MySQLi/PDO/(MySQL) 13 13.04.2008 23:17:42
Altualisieren einer Spalte anhand einer Spalte in einer anderen Tabelle thefifa MySQLi/PDO/(MySQL) 0 25.07.2007 18:34:41
IE verzerrt Zeilen trotz festen Werten Resu HTML, CSS und JavaScript Help! 2 10.04.2006 13:41:27
aus Datei je 10 Zeilen neue Liste? doudie PHP für Fortgeschrittene und Experten 3 29.08.2002 20:58:46


Alle Zeitangaben in WEZ +2. Es ist jetzt 10:37:20 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt