MySQL value als column name

Split1989

hh-student.de
ID: 238425
L
9 April 2007
1.223
85
moin moin habe ein kleines problem und habe nichmal einen ansatz. Evtl kann einer von euch mir weiterhelfen.
habe online nur lösungen mit if ansätzen gefunden welche aber vorraussetzen das vorher bekannt ist wie die "property" heißt. möcht das aber ungern so lösen

folgende tabelle habe ich.
properties
property_id|user_id|property|value
1|2|name|Steffan
2|2|country|Germany
...|...|...|...

und folgende möchte ich gerne ausgegeben bekommen
user_id|name|country|...
2|Steffan|Germany|...

select {something magical} from properties where user_id = 2
 
Du musst dir die Properties wie sie sind aus der Datenbank holen. Das was du vorhst, geht nicht mit einer Datenbankabfrage. Und dann kannst du die Daten mit PHP entsprechend aufbereiten.

Da nimmste dir n Array und setzt als Key den Propertyname und als Value die Value ;)
 
Weil ich nicht die ganzen Sicherheitssachen einbauen wollte, habe ich mir ein Online-Formular zum Fremd-Testen erspart.
Falls aber das unten stehende Ergebnis das ist, was die Problemstellung gelöst haben will, verstehe ich nicht wirklich die Schwierigkeit, weil das ja z. B. in phpMyAdmin u. ä. ebenfalls gelöst werden muss. Und das geht ohne if und switch, und es genügt 1 Query.



edit:
phpMyAdmin wird wohl anders die Eigenschaften laden, da wesentlich mehr Infos benötigt werden.
 
Zuletzt bearbeitet:
ALso, im Prinzip so, aber eben mit einer 1 Query:
Du musst dir die Properties wie sie sind aus der Datenbank holen. Das was du vorhst, geht nicht mit einer Datenbankabfrage. Und dann kannst du die Daten mit PHP entsprechend aufbereiten.

Da nimmste dir n Array und setzt als Key den Propertyname und als Value die Value ;)
 
ALso, im Prinzip so, aber eben mit einer 1 Query:

klingt ja schön und gut aber das ist ja eben mein problem das ich die syntax dafür in mysql nicht kenne

PHP:
$output_array = array();
foreach ($properties as $property) {
    $output_array[$property["property"]]= $property["value"];
}
print_r($output_array);

wie baue ich hier dann aber die for each schleife nach?



so sieht meine lösung mit den "if" statements in sql aus
(das sind die quaries der views)
Code:
# v_z_user_property # 
SELECT 
    user_property_id, user_id,
    case when property = "fb_id" then value end as "fb_id",
    case when property = "first_name" then value end as first_name,
    case when property = "last_name" then value end as last_name,
    case when property = "profil_picture" then value end as profil_picture
FROM user_property

# v_user #
SELECT 
user.*,
MAX(fb_id) as fb_id, 
MAX(first_name) as first_name, 
MAX(last_name) as last_name, 
MAX(profil_picture) as profil_picture
FROM user
left outer join v_z_user_property as v_z_u  on user.user_id = v_z_u.user_id
group by user_id


ohne einen expliziten hinweis werde ich hier wohl nicht weiterkommen.


es müsste ja sowas wie das hier geben

Code:
SELECT 
    value as property
FROM properties

wobei hierbei einfach property als "string" interpretiert wird und nicht als der column wert.

oder soetwas in der art
Code:
SELECT value as (SELECT property FROM properties WHERE `property_id` = parent.property_id) FROM properties
 
Zuletzt bearbeitet:
Hallo Split1989,

im sqlfiddle gibt es 2 wesentliche Änderungen im Vergleich zum Eingangspost:
1. Es sind nicht mehr nur die Daten zu genau einer vorgegebenen user_id auszugeben.
2. Es gibt eine unterschiedliche Anzahl an "property" zu einer vorgegebenen user_id.
Zusätzlich könnten bei gleicher Anzahl die "property"-Werte selbst unterschiedlich sein, was aber im sqlfiddle (noch) nicht der Fall ist. Dies ist bei Ausgabe von Daten zu mehr als genau einer vorgegebenen user_id relevant.

Das verändert die Aufgabe und verkompliziert die Sache.
Also mal Aufteilung in 2 Aufgaben:
Aufgabe 1: wie im Eingangspost beschrieben zu genau einer vorgegebenen user_id
Aufgabe 2: zu allen eingetragenen user_id mit unterschiedlicher Anzahl property; zusätzlich mit unterschiedlichen property

Aufgabe 2 habe ich noch nicht gelöst :( Bin aber dran; ist interessant :) kann dauern 8)

edit:
Zwar kein if/switch, aber 3 Queries:
 
Zuletzt bearbeitet:
Extrem kompliziert/unintuitiv lösbare Probleme bei Datenbank-Abfragen sind in der Regel ein recht deutlicher Hinweis für schlechtes/falsches Datenbankdesign…
Nach ACID sieht das jedenfalls nicht aus –?und ich bin mir sicher, dass das trotz der offenbar sehr freien Definition von "properties" durchaus möglich wäre. Und bestimmt auch bei der Erstellung einfacherer Abfragen hälfe :)
 
Extrem kompliziert/unintuitiv lösbare Probleme bei Datenbank-Abfragen sind in der Regel ein recht deutlicher Hinweis für schlechtes/falsches Datenbankdesign…

Das stimmt schon ... die grundlegenden user daten speicher ich auch in einer extra tabelle und ein problem beim auslesen gibt es ja mit der vorliegenden struktur auch nicht, aber ein wie von mir gewünschter view wäre halt gut zum administrieren.

die 3te normalform sollte das datenbank design schon einhalten.


Schöne Grüße
 
Das ist doch schlichtweg eine Pivot Abfrage oder übersehe ich da jetzt was?

In DBMS die PIVOT unterstützen sieht das Query dann so aus

Code:
SELECT * 
FROM properties 
PIVOT (    
    value     
    FOR [property] IN (
        SELECT property FROM properties GROUP BY property
    ) 
) AS pivot

Problem ist nur das leider nicht alle DBMS PIVOT unterstützen.
In dennen die es nicht eingebaut haben muss man die Funktion nachbauen, was zum Teil ziemlich häßliche querys ergibt.

Code Freihand und im gehen geschrieben. Für Fehler haftet der Verwender. :ugly:
 
Bist den auf MySQL festgelegt?

leider ja.

so in der art hatte ich es anfangs auch .... hab es jetzt mit einpaar verrückten abfragen hinbekommen es "halbautomatisch" generieren zu lassen. muss halt bei jeder neuen propertie (die noch nie verwendet wurde) den view einmal neu erstellen. Aber der view hat immer die gleiche qry muss halt neu instanziert werden.