Abfrage mehrer datensätze über WHERE-clause

fritzje610

Mitglied
Hallo zusammen,

ich habe ein Problem mit diesem Query:

PHP:
$query = "SELECT Aktueller_Wert FROM merkmale WHERE (Bez_Nr = '" . $id . "')  
AND Merkmal = 'Geburtstag'
OR Merkmal = 'Geburtsort'
OR Merkmal = 'Geburtsname'";

Es geht darum, dass in der Tabelle Merkmale alle Eigenschaften einer Person stehen. Die Spalte Merkmal bezeichnet um was es geht und in Aktueller_Wert steht der passende Wert für diese Person drin. Neben den drei genannten Merkmalen gibt es noch einige mehr, die aber hier nicht relevant sind.
Über (Bez_Nr = ".id.") stellt sich die Verbindung her, dass in Merkmale nur die Sätze berücksichtigt werden in denen Bez_Nr und die $id gleich sind.

Das Problem ist nun dass ich eben nur ausgewählte Merkmale als Ergebnis haben möchte. Dieses Query schmeisst das Ergebnis durcheinander, es kommt also nicht zuerst der Wert für Geburttag an sondern willkürlich einer der dreien.

Wie muss ich denn das Query angehen, damit die gewünschten Sätze in richtiger Reihenfolge ankommen ?


Gruß

Michael
 
Hi,

was für ein Typ sind die Spalten "Aktueller_Wert" und "Merkmal"? Sind dort separierte Werte (z. B. mit Kommata, o. ä. getrennt) hinterlegt? :confused:

Falls ja, kannst Du den Wert(e) als array auslesen, per explode() aufsplitten und entsprechend ausgeben (falls die Werte immer in derselben Reihenfolge eingetragen wurden).

Ich würde Dir jedoch eher zu der Variante eindeutige Bezeichnung raten, sprich wirklich passende Spalten einzurichten, wie z. B. "Geburtstag", "Geburtort", "Geburtsname", etc.. Da lässt es sich leichter arbeiten. ;)


Beste Grüße,
preko
 
Hi,

die Spaltentypen sind varchar/255. Das Problem ist, dass ich die Daten aus Access per Datei importiere. Somit sind mir die Spalten vorgegeben. Da kann ich auch nix ändern, da die später auch wieder nach Access zurückgegeben werden. Somit muss ich es so irgendwie hinkriegen. Ausser den beiden Spalten gibt es noch eine Spalte PNr in der Relation merkmale, die dort der Primärschlüssel ist.

Kann ich darüber irgendwie was machen? Momentan bekomme ich im php Fehlermeldungen wenn ich versuche die Werte zuzuweisen.

PHP:
 while ($spalte = mysql_fetch_assoc ($result))
 	{
         $gebtag -> $spalte['Geburtstag'];
	 $gebort -> $spalte['Geburtsort'];
	 $gebname ->$spalte['Geburtsname'];
	}
        echo $gebtag;
	echo $gebort;
	echo $gebname;



Fehlermeldungen:

Code:
Notice: Undefined index: Geburtstag in C:\Dokumente und Einstellungen\Michael Stutz\Eigene Dateien\xampp\htdocs\aur\contents\anzeige.php on line 44

Notice: Undefined variable: gebtag in C:\Dokumente und Einstellungen\Michael Stutz\Eigene Dateien\xampp\htdocs\aur\contents\anzeige.php on line 44

Notice: Trying to get property of non-object in C:\Dokumente und Einstellungen\Michael Stutz\Eigene Dateien\xampp\htdocs\aur\contents\anzeige.php on line 44


Gruß

Michael
 
Ich glaub ich kenn deine Problematik.
Das Umwandeln von Kreuztabellen in eine flache Struktur ist nicht so trivial.

In meinem Testszenario(mysql) hat das funktioniert:
SQL:
select 
  `Bez_Nr`,
  MAX(CASE WHEN `merkmal` = "Geburtsort" THEN `Aktueller_wert` else "" end) as `Geburtsort`,
  MAX(CASE WHEN `merkmal` = "Geburtstag" then `Aktueller_wert` else "" end) as `Geburtstag`, 
  MAX(CASE WHEN `merkmal` = "Geburtsname" then `Aktueller_wert` else "" end) as `Geburtsname` 
from merkmale 
where `Bez_Nr` =  "'. $id .'"
group by `Bez_Nr`

Ich würde bei so einer Struktur, aber noch eine Tabelle `erlaubte_Merkmale` erstellen. In der `merkmale` Tabelle landet dann nur noch die ID aus `erlaubte_Merkmale` als Fremdschluessel. Damit vermeidest du Redundanzen -> 3.NF.

Ums nachzuvollziehen:
SQL:
create table merkmale ( 
  Aktueller_wert varchar(255), 
  merkmal varchar(255) , 
  Bez_nr varchar(255)
);

insert into merkmale VALUES 
  ("Testhausen","Geburtsort","1"),
  ("01.01.1970","Geburtstag","1"),
  ("Mustermann","Geburtsname","1"),
  ("Teststadt","Geburtsort","2");

select 
  `Bez_Nr`,
  MAX(CASE WHEN `merkmal` = "Geburtsort" THEN `Aktueller_wert` else "" end) as `Geburtsort`,
  MAX(CASE WHEN `merkmal` = "Geburtstag" then `Aktueller_wert` else "" end) as `Geburtstag`, 
  MAX(CASE WHEN `merkmal` = "Geburtsname" then `Aktueller_wert` else "" end) as `Geburtsname` 
from merkmale 
group by `Bez_Nr`

liefert dann:
Code:
+--------+------------+------------+-------------+
| Bez_Nr | Geburtsort | Geburtstag | Geburtsname |
+--------+------------+------------+-------------+
| 1      | Testhausen | 01.01.1970 | Mustermann  |
| 2      | Teststadt  |            |             |
+--------+------------+------------+-------------+
 
Zuletzt bearbeitet:
Update:

Wenn ich die Zuweisung so mache:

PHP:
while($row = mysql_fetch_row($result))
 	{
      $gebdatum = $row[1];
     	}
    echo $gebdatum;

funktioniert es auch, das in $gebdatum der passende Inhalt drin steht. Das dumme daran ist, das in $row ja immer die aktuelle Zeile des querys steht und ich somit soviele Arrys zurückbekomme wie OR's im Query stehen. Jedes Array ein Wert groß. Das Problem ist nun, dass ich natürlich jedes Arrayinhalt in einer separaten Variablen stehen soll.
Wie tun ?


Gruß

Michael
 
Du solltest wenn du meinen Query nimmst so zugreifen können:
PHP:
while($row = mysql_fetch_row($result))
     {
      $gebort = $row[1];
      $gebtag = $row[2];
      $gebname = $row[3];
         }
    echo $gebdatum;
    echo $gebtag;
    echo $gebname:
Obwohl das ja schon wieder php ist und mit Datenbanken eher weniger zu tun hat. ;)
 
Der Query funktioniert schon mal im phpMyAdmin. Jetzt muss ich ihn noch "php-konform" machen, mit edn ganzen ' und ".


Gruß

Michael
 
Es sollte ein cut'n'paste in deine php Datei reichen.
Aussen rum fehlen nur noch die '. Einfache Hochkommas.

Alle Tabellennamen und Spalten sind mit backticks ` gequoted, das macht php nichts aus. :)
 
Nein, nicht wirklich. So sieht der Query aus:

PHP:
$query = "SELECT `Bez_Nr`, MAX(CASE WHEN `merkmal` = 'Geburtsort' THEN `Aktueller_Wert` else "" end) AS `Geburtsort`, 
MAX(CASE WHEN `merkmal` = 'Geburtstag' then `Aktueller_Wert` else "" end) AS `Geburtstag`, 
MAX(CASE WHEN `merkmal` = 'Geburtsname' then `Aktueller_wert` else "" end) AS `Geburtsname` 
FROM merkmale WHERE `Bez_Nr` =  ". $id ." GROUP BY `Bez_Nr` ";

mit dieser Fehlermeldung:

Code:
Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING 
in C:\Dokumente und Einstellungen\Michael Stutz\Eigene Dateien\xampp\htdocs\aur\contents\anzeige.php on line 29



Gruß

Michael
 
:) Ich sag ja einfache Hochkommas :)

PHP:
$query ='SELECT
        `Bez_Nr`,
        MAX(CASE WHEN `merkmal` = "Geburtsort" THEN `Aktueller_wert` else "" end) AS `Geburtsort`,
        MAX(CASE WHEN `merkmal` = "Geburtstag" then `Aktueller_wert` else "" end) AS `Geburtstag`,
        MAX(CASE WHEN `merkmal` = "Geburtsname" then `Aktueller_wert` else "" end) AS `Geburtsname`
      FROM merkmale
      WHERE `Bez_Nr` =  "'. $id .'"
      GROUP BY `Bez_Nr`';
 

Neue Beiträge

Zurück