Willkommen in der Webstatt Zum Webstatt Blog und Stories
abu am 19.02.07 17:35

Hi,

ich möchte eine SQL abfrage ausführen in etwas so:
UPDATE `nx__projects__hits` SET `hits` = `hits` +1 WHERE `name` = "nxTerminal"

Nur möchte ich das wenn es keine Spalte mit dem Namen "nxTerminal" gibt das dann eine neue Spalte angelegt wird (also praktisch INSERT INTO). Wie kann ich das in der abfrage lösen ?

mfg, Björn

netcup.de Warum gibt es hier Werbung?
Snake am 19.02.07 17:44

setz bei dem feld einfach das attribut unique.
ob das ne schöne lösung ist...darüber lässt sich streiten

Michael Michael am 19.02.07 17:53

Ich würde es in zwei Abfragen machen, da mir spontan kein Weg einfällt es in einer zu machen und es sicher nicht schön wird.

Einfach ein COUNT(*) ... WHERE `name` = "nxTerminal"
Bei ==0 INSERT ansonsten UPDATE

mab mab am 19.02.07 19:18

hey,
hier mal ein Versuch das ganze in einem Query zu machen:


ALTER TABLE nx_project_hits

CASE WHEN EXISTS (SELECT hits FROM nx_project_hits WHERE name LIKE nxTerminal)
THEN
UPDATE nx_projects_hits SET hits = hits + 1 WHERE name = ....
ELSE
ADD COLUMN nxTerminal char(32)
UPDATE nx_projects_hits SET hits = hits + 1 WHERE name = ....
END




Musst halt noch ein bisschen anpassen. Anstatt CASE kannst du natürlich auch IF verwenden.

Bin mir nicht ganz sicher, aber mit "show columns" geht das auch irgendwie :)

grüße
mab

Wasili am 19.02.07 19:42

Verwechselst du wirklich Spalten mit Datensätze, oder täusche ich mich nur?
Wenn du es tatsächlich verwechselt, gibts eine Einfache Lösung.. Ob sie schön ist; ka:

mysql_query('UPDATE `nx__projects__hits` SET `hits` = `hits` +1 WHERE `name` = "nxTerminal"');

if(mysql_affected_rows() <= 0) {
// Keine Datensätze geupdatet, neuen Datensatz einfügen
mysql_query('INSERT INTO `nx__projects__hits` SET `hits` = 0, `name` = "nxTerminal"');
}
else {
// Erfolgreich aktualisiert
}

abu am 19.02.07 20:14

Quote
Original von Wasili
Verwechselst du wirklich Spalten mit Datensätze, oder täusche ich mich nur?
Wenn du es tatsächlich verwechselt, gibts eine Einfache Lösung.. Ob sie schön ist; ka:


Ah da hab ich wohl was durch einander gebracht ich meine natürlich Datensätze.
Ich würde das ganze gerne in einer SQL-Abfrage machen.

Wie das mit Unique gehen soll, wei? ich nicht.

Die CASE Anweisung will MySQL nicht verarbeiten:
CASE WHEN EXITS(SELECT hits FROM nx_project_hits WHERE name='nxTerminal')
THEN
UPDATE nx_projects_hits SET hits = hits + 1 WHERE name = 'nxTerminal'
ELSE
INSERT INTO nx_projects_hits SET hits =1 AND name = 'nxTerminal'
END

->#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CASE WHEN EXITS(SELECT hits FROM nx_project_hits WHERE name='nxTerminal')
' at line 1

Gib es da noch ne möglichkeit mit CASE ?

mfg, Björn

mab mab am 19.02.07 20:40

ööhm. ok für den fall, dass du jetzt einen datensatz einfügen möchtest, wenn noch keiner da is... (macht das sinn zu prüfen?? )


SELECT If (
SELECT count(*) FROM tablename WHERE column= 'blaa' == '0',
INSERT....
)
FROM tablename



falls der syntax nicht ganz stimmt:
http://dev.mysql.com/doc/refman/5.1/de/if-statement.html

oder mach's gleich wie Wasili gepostet hat.

gruß

abu am 19.02.07 23:02

Ich habs geschafft :)

INSERT INTO nx__projects_hits(name) VALUES ('nxTerminal')
ON DUPLICATE KEY UPDATE hits=hits+1;


SQL kann wirklich viel man muss nur wissen wie

mfg, Björn

Kevz am 20.02.07 12:48

Wow, diese Lösung nenn ich echt mal elegant O.O
Also die Methode is mir neu.. *mal ins MySQL Buch vertief*

abu am 20.02.07 14:00

Quote
Original von Kevz
Wow, diese Lösung nenn ich echt mal elegant O.O
Also die Methode is mir neu.. *mal ins MySQL Buch vertief*


Dazu muss ich sagen sie ist nicht von mir *g*

Kevz am 20.02.07 15:16

*lach*, aber es ist trotzdem nicht so umständlich - wie mal eben extra noch PHP dazu zu beziehen =)

abu am 26.02.07 21:25

Leider gib es den Befehl nicht in allen mySQL Versionen :(

Kevz am 26.02.07 22:10

Hmpf =( *heul*

Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt