php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 26-08-2010, 14:28
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard Eine Spalte in mehrere aufteilen

Hallo
Ich versuche in MySQL eine solche Tabelle
Code:
id | text
1  | bla
2  | blup
1  | foo
2  | bar
In ein solches Abfrage-Resultat zu verwandeln:
Code:
id | text1 | text2
1  | bla   | foo
2  | blup  | bar
Hat jemand einen Vorschlag wie ich das am besten erledige?

PS: Das Beispiel ist stark vereinfacht, die Tabelle ist natürlich nicht genau so aufgebaut. Zusätzlich kommt ausserdem noch die Schwierigkeit hinzu, dass pro Id mehrere Texte (0, 1, 2, 3 oder auch 100) verfügbar sein können.

Geändert von sili (26-08-2010 um 14:51 Uhr)
Mit Zitat antworten
  #2 (permalink)  
Alt 26-08-2010, 14:31
eagle275
 Registrierter Benutzer
Links : Onlinestatus : eagle275 ist offline
Registriert seit: Jun 2010
Beiträge: 403
eagle275 befindet sich auf einem aufstrebenden Ast
Standard

das mit "mehrere Texte pro id" schreit förmlich nach einer Zuordnungstabelle.... (m : n Relation ... )

die hast du ja vorliegen, alles was der fehlt wäre noch ein Primärschlüssel (1 zusätzliche id-Spalte oder ähnliches) ..

von der Änderung auf eine "breite" Tabelle mit mehr oder weniger Text-spalten pro ID würde ich aus Gründen von Normalisierung ernsthaft abraten

wenn du das dann abfragen willst , dann mit

"SELECT text FROM tabelle where id= 'x' "

dann kannst du in deiner Programmiersprache wunderbar alle gefundenen Text-Einträge zu deiner ID abklappern
__________________

Wer LESEN kann, ist klar im Vorteil!

Geändert von eagle275 (26-08-2010 um 14:38 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 26-08-2010, 14:35
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Das sieht aber nach einem gewaltigen Designfehler aus. Beschäftige dich mal mit Normalisierung.

Peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Mit Zitat antworten
  #4 (permalink)  
Alt 26-08-2010, 14:39
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Vielleicht hilft dir GROUP_CONCAT?
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #5 (permalink)  
Alt 26-08-2010, 14:41
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von eagle275 Beitrag anzeigen
das mit "mehrere Texte pro id" schreit förmlich nach einer Zuordnungstabelle.... (m : n Relation ... )

die hast du ja vorliegen, alles was der fehlt wäre noch ein Primärschlüssel (1 zusätzliche id-Spalte oder ähnliches) ..
Die entsprechende Spalte ist natürlich bereits vorhanden. Für mein Beispiel habe ich diese nur der Einfachheit halber entfernt. Ausserdem gehe ich davon aus, dass die Spalte für die gesuchte Abfrage nicht relevant ist

Zitat:
Zitat von eagle275 Beitrag anzeigen
von der Änderung auf eine "breite" Tabelle mit mehr oder weniger Text-spalten pro ID würde ich aus Gründen von Normalisierung ernsthaft abraten

wenn du das dann abfragen willst , dann mit

"SELECT * FROM tabelle where id= 'x' "

dann kannst du in deiner Programmiersprache wunderbar alle gefundenen Text-Einträge zu deiner ID abklappern
Das ist mir bewusst und wäre ja auch kein grosses Problem. Allerdings hätte ich gerne eine Lösung in MySQL (falls das so überhaupt möglich ist).

Zitat:
Zitat von Kropff Beitrag anzeigen
Das sieht aber nach einem gewaltigen Designfehler aus. Beschäftige dich mal mit Normalisierung.
Meine Datenbank ist normalisiert, nur das gezeigte und stark vereinfachte Beispiel ist es nicht

Zitat:
Zitat von wahsaga Beitrag anzeigen
Vielleicht hilft dir GROUP_CONCAT?
Das hilft mir leider auch nicht weiter, da die einzelnen Texte nach der Abfrage jeweils noch weiterverarbeitet werden und dementsprechend als einzelne Variablen vorhanden sein müssen.

Geändert von sili (26-08-2010 um 14:46 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 26-08-2010, 15:35
eagle275
 Registrierter Benutzer
Links : Onlinestatus : eagle275 ist offline
Registriert seit: Jun 2010
Beiträge: 403
eagle275 befindet sich auf einem aufstrebenden Ast
Standard

hm .. ich weiß nicht , was komplizierter ist ...


eine Spalte in 10 Zeilen zu lesen, oder 1 Zeile mit 10 spalten


von daher ... warum soll dir mysql da noch was "kochen" wenn es dir bereits die gewünschten Daten serviert?
__________________

Wer LESEN kann, ist klar im Vorteil!
Mit Zitat antworten
  #7 (permalink)  
Alt 26-08-2010, 15:37
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Zitat von sili Beitrag anzeigen
Meine Datenbank ist normalisiert, nur das gezeigte und stark vereinfachte Beispiel ist es nicht
Das ist ein Widerspruch in sich. Eine Datenbank oder vielmehr ein Schema ist erst dann normalisiert, wenn sie – als Ganzes – den Normalisierungskriterien entspricht. Sobald eine einzige Relation/Tabelle nicht Normalform hat, gilt das ganze Schema als nicht normalisiert.
Das ist keine theoretische Kümmelkernspalterei, sondern soll dich dazu bewegen, diese Tabelle zu normalisieren.

Übrigens geht es afaik gar nicht ohne Normalisierung. Um die Tupel (1,bla) und (1,foo) zum Ergebnis (1, bla, foo) umzuwandeln, musst du in der Query angeben, dass bla in text1 und foo in text2 gehört. Da sich die Tupel aber nur im Attribut text unterscheiden (die ID ist gleich), musst du - entweder die Strings bla und foo (bzw. alle Werte von text) in der Query in IF-ELSE-Klauseln verbasteln
- oder die möglicherweise zugrundeliegende Modulo-Entscheidung nutzen (Vorkommen von ID x durchnummerieren, bei geraden Nummern text in text1, bei ungeraden in text2). Das geht zum einen nur bei totaler Ordnung (ODER BY) und andererseits mangels Row-Counter nur mit Hilfe einer Prozedur (wenn überhaupt).

Lange Rede … Normalisieren! Punkt.
Mit Zitat antworten
  #8 (permalink)  
Alt 27-08-2010, 14:18
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von eagle275 Beitrag anzeigen
hm .. ich weiß nicht , was komplizierter ist ...

eine Spalte in 10 Zeilen zu lesen, oder 1 Zeile mit 10 spalten

von daher ... warum soll dir mysql da noch was "kochen" wenn es dir bereits die gewünschten Daten serviert?
Welches komplizierter ist, ist mir nicht so wichtig. Allerdings gehe ich davon aus, dass ein DB-Engine grössere Datenmengen wesentlich schneller bearbeiten kann als PHP.

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Das ist ein Widerspruch in sich. Eine Datenbank oder vielmehr ein Schema ist erst dann normalisiert, wenn sie – als Ganzes – den Normalisierungskriterien entspricht. Sobald eine einzige Relation/Tabelle nicht Normalform hat, gilt das ganze Schema als nicht normalisiert.
Da stimme ich dir voll und ganz zu. Nur frage ich mich, wie du anhand eines "stark vereinfachten" Beispiels auf meine Relation und deren angeblich fehlende Normalisierung schliessen kannst
Also nochmals: Das Beispiel ist extrem vereinfacht und kommt so NIRGENDS in meiner Datenbank vor. Meine Relationen SIND normalisiert. Im Beispiel fehlen nur die entscheidenden Attribute um das Beispiel einfach zu halten.

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Um die Tupel (1,bla) und (1,foo) zum Ergebnis (1, bla, foo) umzuwandeln, musst du in der Query angeben, dass bla in text1 und foo in text2 gehört. Da sich die Tupel aber nur im Attribut text unterscheiden (die ID ist gleich), musst du - entweder die Strings bla und foo (bzw. alle Werte von text) in der Query in IF-ELSE-Klauseln verbasteln
- oder die möglicherweise zugrundeliegende Modulo-Entscheidung nutzen (Vorkommen von ID x durchnummerieren, bei geraden Nummern text in text1, bei ungeraden in text2). Das geht zum einen nur bei totaler Ordnung (ODER BY) und andererseits mangels Row-Counter nur mit Hilfe einer Prozedur (wenn überhaupt).
Die Benennung der Spalten ist momentan zweitrangig und kann für ein kleines Proof-of-Concept ohne weiteres statisch erfolgen. Am liebsten würde ich die Bezeichner aber anhand der Werte aus einer anderen Tabelle nennen. Aber das ist dann wieder ein anderes Thema
Mit Zitat antworten
  #9 (permalink)  
Alt 27-08-2010, 14:26
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

wenn es immer die gleiche Anzahl an Texten pro ID ist, könnte man das mit einer Abfrage erledigen. Wenn aber eine ID beliebig oft vorkommt, geht es nicht, weil Abfragen mit einer dynamischen Anzahl Spalten nicht möglich sind.

MySQL kann zwar schneller mit großen Datenmengen umgehen, aber bei der Formatierung/Gruppierung der Ausgabe sind dem Grenzen gesetzt. In deinem Falle kommst du mit PHP wirklich günstiger, selbst wenn es wirklich immer zwei Texte pro ID sein sollten.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #10 (permalink)  
Alt 27-08-2010, 14:27
eagle275
 Registrierter Benutzer
Links : Onlinestatus : eagle275 ist offline
Registriert seit: Jun 2010
Beiträge: 403
eagle275 befindet sich auf einem aufstrebenden Ast
Standard

das Problem ist ... deine gewünschte Abfrage ist leider nicht normalisiert - und stellt daher die Datenbank vor entsprechende Probleme ...

An der Stelle kannst du eigentlich nur mit deiner Programmiersprache arbeiten, um die gewünschte Zusammenstellung zu erreichen ... deren Sinn leider nicht so ganz offensichtlich ist
__________________

Wer LESEN kann, ist klar im Vorteil!
Mit Zitat antworten
  #11 (permalink)  
Alt 27-08-2010, 14:39
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von eagle275 Beitrag anzeigen
das Problem ist ... deine gewünschte Abfrage ist leider nicht normalisiert
Sili sagt, die DB sei es und aus dem gegebenen Beispiel geht auch nicht das Gegenteil hervor, weswegen ich mich frage, warum das hier die ganze Zeit pauschal unterstellt wird.
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #12 (permalink)  
Alt 27-08-2010, 14:39
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Dann werde ich das wohl doch mit PHP erledigen müssen.

Zitat:
Zitat von eagle275 Beitrag anzeigen
An der Stelle kannst du eigentlich nur mit deiner Programmiersprache arbeiten, um die gewünschte Zusammenstellung zu erreichen ... deren Sinn leider nicht so ganz offensichtlich ist
Um das ganze Mal etwas zu erklären: Es gibt eine Tabelle welche eine unbeschränkte Anzahl Suchmuster (XPATH, Reguläre Ausdrücke, ...) speichert. Anschliessend werden Dokumente durchsucht und die gefundenen Daten in der Tabelle vom Beispiel mit ID, Dokument-ID, Muster-ID und Text gespeichert. Nun sollen diese Daten in einer Übersicht dargestellt werden. Mit PHP ist das ja keine Sache, aber MySQL wäre mir lieber gewesen
Mit Zitat antworten
  #13 (permalink)  
Alt 27-08-2010, 15:21
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Zitat von sili Beitrag anzeigen
Also nochmals: Das Beispiel ist extrem vereinfacht und kommt so NIRGENDS in meiner Datenbank vor. Meine Relationen SIND normalisiert. Im Beispiel fehlen nur die entscheidenden Attribute um das Beispiel einfach zu halten.
Wenn man "entscheidende" Dinge weglässt, darf man sich nicht wundern, wenn man falsch verstanden wird.

Ich ging davon aus, dass sich die Tupel nur im Attribut text unterscheiden. Ist wohl nicht so. Anscheinend kann mit IF-ELSE-Konstrukten anhand irgendwelcher Attribute entschieden werden, ob text zu text1 oder text2 wird.
Mit Zitat antworten
  #14 (permalink)  
Alt 27-08-2010, 21:45
sili
 Registrierter Benutzer
Links : Onlinestatus : sili ist offline
Registriert seit: Feb 2004
Beiträge: 115
sili ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Und es geht doch

Hier als kleiner Ansatz:
Code:
SELECT `gid`,
       GROUP_CONCAT(IF(`id`=1, `text`, NULL)) AS `text1`,
       GROUP_CONCAT(IF(`id`=2, `text`, NULL)) AS `text2`
FROM `table`
GROUP BY `gid`
(wahsaga hatte also doch Recht )

Allerdings produziert das nicht genau die Ansicht aus dem Beispiel, aber von der Idee her funktioniert es.

Falls es nun auch noch mit dynamischen Namen und Anzahl Einträgen funktionieren muss, kann man den GROUP_CONCAT() Teil immer noch mit PHP/wasimmer zusammenbasteln.

Geändert von sili (27-08-2010 um 21:48 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[MySQL 4.1] Eine oder Mehrer DB für Datenbankmodell (wettanbieter) zegerman SQL / Datenbanken 3 15-08-2008 11:00
Inhalt einer Spalte aufteilen...wie? Antonia SQL / Datenbanken 2 12-04-2006 21:09
db daten in eine 3 spalten tab aufteilen ! Frashier PHP Developer Forum 19 18-02-2004 17:23
Mehrer Tabellen aber nur eine sichtbar kj187 Apps und PHP Script Gesuche 5 02-05-2003 16:16
mysql_query() auf mehrer Variablen aufteilen andik2000 PHP Developer Forum 3 14-11-2002 16:41

Themen-Optionen
Thema bewerten
Thema bewerten:

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 an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:28 Uhr.