mysql
Antman
- datenbank
0 Stefan0 perox0 Andreas Görtz0 Antman0 Antman0 Andreas Görtz0 Antman0 Andreas Görtz0 Antman
Guten Tag,
als ich damals mit php/myadmin anfing hatte ich noch nicht so die Ahnung vom Tabellendesign. Nun soll eine Tabelle umgestellt werden.
Es handelt sich dabei um eine Tabelle mit Sprachen als Spalten. 'Keyval' ist dabei der Index auf Deutsch und die Spalten stellen die Übersetzungen dar.
Die Tabelle 'translation' sieht folgendermaßen aus:
keyval |de | en | fr | es | it | el
Ein typischer Eintrag wäre:
apfel | Apfel |apple | irgendwas | irgendwas | irgendwas
Nun brauche ich aber nicht jede Spalte ausgefüllt.
Ich möchte die Tabelle aber so haben:
id | lang | keyval | trans
Dann sähe ein Eintrag z.B. so aus:
1 | de | apfel | Apfel
2 |en | apfel | apple
...
Wie macht man das ? Habe keine Lust die Tabelle von Hand neu zu erstellen.
Folgendes habe ich ohne Erfolg probiert:
INSERT INTO translation1 (id, lang, keyval, trans) FROM
(
(SELECT 'NULL', de, keyval, de FROM translation WHERE de NOT IS NULL) UNION
(SELECT 'NULL', en, keyval, en FROM translation WHERE en NOT IS NULL) UNION
(SELECT 'NULL', fr, keyval, fr FROM translation WHERE fr NOT IS NULL) UNION
(SELECT 'NULL', it, keyval, fr FROM translation WHERE it NOT IS NULL) UNION
(SELECT 'NULL', es, keyval, fr FROM translation WHERE es NOT IS NULL) UNION
(SELECT 'NULL', el, keyval, fr FROM translation WHERE el NOT IS NULL)
)
Wer weiß Rat ?
Hallo,
wäre da nicht ein kleines php-Script ratsam, welches einmal
value | de
ausliest und vorhandene Einträge in dem neuen Format sichert, um dann mit
value | en
value | fr
etc. genau so zu verfahren ?
Dauert ja nicht so lang, sowas zu coden.
Gruß,
Stefan
Aber das muss doch mit sql locker gehen. Weiß nicht wie, aber warum das Rad neu erfinden ? Das ganze in simple php Befehle aufzuspalten würde keinen Lerneffekt bringen. ;)
Vielleicht weiß ja doch jemand wie das nur in sql geht.
klar geht das auch mit sql, wenn dus willst, aber willst du das ich das für dich mache? dann haste auch keinen lerneffekt :D
klar geht das auch mit sql, wenn dus willst, aber willst du das ich das für dich mache? dann haste auch keinen lerneffekt :D
Warum denn das nicht ? Das nennt man in der Psychologie 'Modellernen'!
Also ich mache dir hier mal nen Muster:
1. Du erstellst mit 'CREATE TABLE' die neue Tabelle.
2. Du liest mit 'SELECT * FROM' aus der alten Tabelle die Spalten aus.
3. Du schreibst mit 'INSERT INTO' die alten Einträge in die neue.
Wenn du das jetzt im PHPMyAdmin Testest, und ausprobierst, wirst du schnell auf ein Ergebniss kommen! Spiele einfach ein bisschen mit den Befehlen herrum, bis du dein gewünschtes Ergebniss hast.
mfg perox (www.programming-time.de)
Also, ich würde ein PHP Script schreiben, dass eine neue Tabelle erstellt und die einträge aus der alten in die neue einträgt.
dürfte ja kein Problem sein oder? ;)
mfg perox @ www.programming-time.de
Hi,
Folgendes habe ich ohne Erfolg probiert:
INSERT INTO translation1 (id, lang, keyval, trans) FROM
(
(SELECT 'NULL', de, keyval, de FROM translation WHERE de NOT IS NULL) UNION
(SELECT 'NULL', en, keyval, en FROM translation WHERE en NOT IS NULL) UNION
(SELECT 'NULL', fr, keyval, fr FROM translation WHERE fr NOT IS NULL) UNION
(SELECT 'NULL', it, keyval, fr FROM translation WHERE it NOT IS NULL) UNION
(SELECT 'NULL', es, keyval, fr FROM translation WHERE es NOT IS NULL) UNION
(SELECT 'NULL', el, keyval, fr FROM translation WHERE el NOT IS NULL)
)
ein paar Fehler/Ungenauigkeiten:
1. ausgehend davon, dass du das Feld 'id' deiner Tabelle translation1 auf auto_increment gesetzt hast, brauchst du das Feld id gar nicht angeben (abgesehen davon, dass du es als String angibst, 'NULL' anstatt NULL).
2. das Schlüsselwort FROM in der ersten Zeile ist IMHO falsch. Richtige Syntax:
INSERT INTO
tabellenname (spaltenname,...)
SELECT
...
3. der zweite Wert bei den SELECTS muss jeweils der String 'de', 'en', usw. sein, nicht der Wert der Spalte de, en, usw.
Also (ungetestet):
INSERT INTO
translation1 (lang,keyval,trans)
SELECT
'de',keyval,de FROM translation WHERE (de NOT IS NULL)
UNION SELECT
...
Gruß,
Andreas.
Hallo Andreas,
INSERT INTO translation1 (lang, keyval, trans)
(
SELECT 'de',keyval,de FROM translation WHERE (de NOT IS NULL)
UNION
SELECT 'en',keyval,en FROM translation WHERE (en NOT IS NULL)
UNION
SELECT 'fr',keyval,fr FROM translation WHERE (fr NOT IS NULL)
UNION
SELECT 'it',keyval,it FROM translation WHERE (it NOT IS NULL)
UNION
SELECT 'es',keyval,es FROM translation WHERE (es NOT IS NULL)
UNION
SELECT 'el',keyval,el FROM translation WHERE (el NOT IS NULL)
UNION
SELECT 'nl',keyval,nl FROM translation WHERE (nl NOT IS NULL))
Gibt den Fehler:
MySQL meldet:
#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 'IS NULL )
UNION
SELECT 'en', keyval, en
FROM translation
WH
Einen Fehler habe ich gefunden:
Es muss heißen "IS NOT NULL" anstatt "NOT IS NULL":
INSERT INTO translation1 (lang, keyval, trans)
(
SELECT 'de',keyval,de FROM translation WHERE (de IS NOT NULL) UNION
SELECT 'en',keyval,en FROM translation WHERE (en IS NOT NULL) UNION
SELECT 'fr',keyval,fr FROM translation WHERE (fr IS NOT NULL) UNION
SELECT 'it',keyval,it FROM translation WHERE (it IS NOT NULL) UNION
SELECT 'es',keyval,es FROM translation WHERE (es IS NOT NULL) UNION
SELECT 'el',keyval,el FROM translation WHERE (el IS NOT NULL) UNION
SELECT 'nl',keyval,nl FROM translation WHERE (nl IS NOT NULL)
)
Klappt aber immer noch nicht.
Hi,
Es muss heißen "IS NOT NULL" anstatt "NOT IS NULL":
jau - hab ich übersehen.
Klappt aber immer noch nicht.
was für eine Fehlermeldung kommt denn jetzt?
Gruß,
Andreas.
was für eine Fehlermeldung kommt denn jetzt?
MySQL meldet:
#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 'UNION
SELECT 'en', keyval, en
FROM translation
WHERE ( en IS
Hi,
#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 'UNION
SELECT 'en', keyval, en
FROM translation
WHERE ( en IS
ja - das liegt an der Klammerung, die hat da nichts zu suchen. So hat es bei mir funktioniert:
INSERT INTO
translation1 (lang, keyval, trans)
SELECT 'de',keyval,de
FROM translation WHERE (de IS NOT NULL)
UNION SELECT 'en',keyval,en
FROM translation WHERE (en IS NOT NULL)
UNION SELECT 'fr',keyval,fr
FROM translation WHERE (fr IS NOT NULL)
UNION SELECT 'it',keyval,it
FROM translation WHERE (it IS NOT NULL)
UNION SELECT 'es',keyval,es
FROM translation WHERE (es IS NOT NULL)
UNION SELECT 'el',keyval,el
FROM translation WHERE (el IS NOT NULL)
UNION SELECT 'nl',keyval,nl
FROM translation WHERE (nl IS NOT NULL)
Gruß,
Andreas.
Hallo Andreas,
es lag wirklich an den Klammern. Vielen, vielen Dank.
Sehr nett von dir.
Gruß
Antman