php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 21.06.2011, 03:29  
Quu
Benutzer
 
Benutzerbild von Quu
 
Registriert seit: 01.04.2011
Beiträge: 32
PHP-Kenntnisse:
Fortgeschritten
Quu befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] Tabelle in Abhängigkeit einer anderen Tabelle

Hallo,

bescheuerter Threadtitel, aber mir fällt kein besserer ein.

Wie kann ich (bzw kann ich) wenn ich 3 Tabellen hab:
A (id, tbl_name, tbl_pk)
B( id, sonstiges)
C (id, sonstiges_nicht_sonstiges_von_b)

Eine Abfrage gestalten dass ich mit einem Join Tabelle A und Tabelle B oder C ( in Abhängigkeit von tbl_name) bekomme.
Pseudocode der in ähnlichen Experimenten nicht funktionierte:
SELECT * FROM A, a.tbl_name WHERE A.id=42 AND a.tbl_name.id=tbl_pk

Ich hoffe ich konnte mein Problem verständlich ausdrücken, obwohl ich daran zweifle.

Dass das mit 2 Querys und PHP einfach zu bewerkstelligen ist weiss ich

Danke,

Quurks
__________________
"Das Unendliche ist weit, vor allem gegen Ende" - Alphonse Allais
Quu ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 21.06.2011, 09:13  
Moderator¹
 
Registriert seit: 28.03.2010
Beiträge: 7.470
PHP-Kenntnisse:
Fortgeschritten
ChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer AnblickChrisB ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von Quu Beitrag anzeigen
Wie kann ich (bzw kann ich) wenn ich 3 Tabellen hab: [...] Eine Abfrage gestalten dass ich mit einem Join Tabelle A und Tabelle B oder C ( in Abhängigkeit von tbl_name) bekomme.
Auf vernünftigem Wege - gar nicht.

Beim Abfragen von Daten aus einer DB solltest du eigentlich schon vorher wissen, aus welchen Tabellen du Daten haben wilst.
Das erst zur Laufzeit abhängig vom Inhalt einer Spalte zu bestimmen, ist ungewöhnlich und auch nicht wirklich pratikabel.

(Ich hab zwar mal irgendwo einen Workaround mit PREPARE gesehen, aber sowas ist nicht wirklich empfehlenswert.)
__________________
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
ChrisB ist offline   Mit Zitat antworten
Alt 21.06.2011, 09:49  
Erfahrener Benutzer
 
Registriert seit: 02.09.2009
Beiträge: 1.019
PHP-Kenntnisse:
Fortgeschritten
mquadrat befindet sich auf einem aufstrebenden Ast
Standard

Die einzige Möglichkeit, die mir ADHOC einfällt wäre eine Stored-Procedure. Da hat man dann aber die Tabellennamen als String drin stehen. Nicht wirklich elegant und Wartbarkeit ist auch was anderes.

Ist das eine Vererbungshierarchie? Wenn ja kannst du dir mal die Beschreibungen verschiedener OR-Mapper anschauen und gucken ob sich da was passendes findet.
__________________
Wir suchen PHP Entwickler (Vollzeit) im Raum Darmstadt / Rhein-Main. Infos via E-Mail mueller@new-frontiers.de
mquadrat ist offline   Mit Zitat antworten
Alt 21.06.2011, 10:07  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

oder du joinst immer zwingend beide Tabellen hinzu - dann solltest du aber aussagekräftige Spaltennamen nehmen, um Einträge von Tabelle B von denen der Tabelle C unterscheiden zu können

Code:
SELECT * FROM a
LEFT JOIN b ON b.id=a.fremd_key_b
LEFT JOIN c ON c.id=a.fremd_key_c
WHERE xyz
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 21.06.2011, 14:08  
Quu
Benutzer
 
Benutzerbild von Quu
 
Registriert seit: 01.04.2011
Beiträge: 32
PHP-Kenntnisse:
Fortgeschritten
Quu befindet sich auf einem aufstrebenden Ast
Standard

Erstmal danke für die Antworten.

Beim dazujoinen tritt das Problem auf dass ich nicht nur die Tabellen B und C habe sondern aktuell die Tabellen B bis G. Und durch viele Joins wird das sicher nicht Performanter.
Eine andere Möglichkeit wäre nur die Tabelle A zu haben, dann spare ich mir die Joins. Problem: die Hälfte der Spalten ist überflüssig. Und die Normalformen finden dass sicher auch nicht so toll.

Der Grund warum ich das überhaupt möchte, ist dass in Tabelle A events liegen, die Zwingend zeitlich richtig ausgeführt werden müssen. Es gibt unterschiedliche Eventtypen, halt einen pro Tabelle B-G. Damit ich nicht bei jedem Seitenaufruf 6 SELECTqueries - einen pro Tabelle - pro abzuarbeitendem Event habe habe ich eine Zentrale Tabelle - A - Wo einfach herausgefunden kann was als nächstes dran ist.

Jetzt könnt ihr - hoffentlich - nachvollziehen warum ich das möchte.
Wenn keine eine bessere Idee zur Speicherung hat, dann ist das hier wohl erledigt.
__________________
"Das Unendliche ist weit, vor allem gegen Ende" - Alphonse Allais
Quu ist offline   Mit Zitat antworten
Alt 26.06.2011, 13:49  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 300
PHP-Kenntnisse:
Fortgeschritten
Asterixus sorgt für eine eindrucksvolle AtmosphäreAsterixus sorgt für eine eindrucksvolle Atmosphäre
Asterixus eine Nachricht über Skype™ schicken
Standard

Wie ich es dir schon vor zwei Monaten in der PM gesagt habe, sind sechs Querys pro Seitenaufruf pro Event nicht nötig.

Insgesamt sind nur in deinem Fall maximal sieben Querys nötig.

PHP-Code:

$tabellen
['B'] = array();
$tabellen['C'] = array();
$tabellen['D'] = array();
$tabellen['E'] = array();
$tabellen['F'] = array();
$tabellen['G'] = array();

$reihenfolge = array();

$event_informationen = array();


$sql 'select event_tabelle, event_id from A where ... order by ....';
$result $db->query($sql);
while (
$row $result->fetchAssoc()) {
    
$tabellen[$row['event_tabelle']][] = $row['event_id'];
    
$reihenfolge[] = $row['event_id'];
}
$result->free();

foreach(
$tabellen as $tabellen_name=>$event_ids) {
    if (
count($event_ids) > 0) {
        
$sql 'select *, \''.$tabellen_name.'\' tabellen_name from '.$tabellen_name.' where event_id in('.implode($event_ids',').')';
        
$result $db->query($sql);
        while(
$row $result->fetchAssoc()) {
            
$event_informationen[$row['event_id']] = $row;
       }
       
$result->free();
    }
}

foreach(
$reihenfolge as $zu_bearbeitende_id) {
    
$informationen_fuer_aktuelle_id $event_informationen[$zu_bearbeitende_id];
    new 
EventHandler($informationen_fuer_aktuelle_id);


Damit hast du alle Informationen. Die EventHandler-Klasse steht für die Verarbeitung der Informationen, die du erhalten hast.

Geändert von Asterixus (26.06.2011 um 13:53 Uhr).
Asterixus ist offline   Mit Zitat antworten
Alt 26.06.2011, 13:56  
Quu
Benutzer
 
Benutzerbild von Quu
 
Registriert seit: 01.04.2011
Beiträge: 32
PHP-Kenntnisse:
Fortgeschritten
Quu befindet sich auf einem aufstrebenden Ast
Standard

Da habe ich dann das Problem dass mehrere paralell zugreifende Instanzen die Ereignisse mehrmals abarbeiten könnten. Es sei denn, ich locke den gesamten Bereich oder lasse die Seite berechenn auch wenn eine andere Instanz noch die Ereignisse abarbeitet.

Wie dem auch sei, ich habe jetzt alles in eine Tabelle gepackt, damit ist das Problem gelöst
__________________
"Das Unendliche ist weit, vor allem gegen Ende" - Alphonse Allais
Quu ist offline   Mit Zitat antworten
Alt 26.06.2011, 14:05  
Erfahrener Benutzer
 
Registriert seit: 03.08.2010
Beiträge: 300
PHP-Kenntnisse:
Fortgeschritten
Asterixus sorgt für eine eindrucksvolle AtmosphäreAsterixus sorgt für eine eindrucksvolle Atmosphäre
Asterixus eine Nachricht über Skype™ schicken
Standard

Verstehe ich nicht.
Was ist das Problem daran, Tabellen zu schließen (locken)? Dasselbe Problem hast du bei der "eine-Tabelle-Lösung" nämlich auch. Zwei Instanzen können nahezu zeitgleich gestartet werden.
Du brauchst nur die Haupttabelle zu schließen (deswegen die where-Klausel). Packe den ganzen Kram zusätzlich in eine Transaktion und du bist deine Sorgen los.


Alles in eine Tabelle stopfen ist nicht optimal, denn es ist unübersichtlich, es verlagert die SQL-Logik auf eine PHP-Logik und es ändert an der Problematik überhaupt nichts.
Asterixus ist offline   Mit Zitat antworten
Alt 26.06.2011, 14:15  
Quu
Benutzer
 
Benutzerbild von Quu
 
Registriert seit: 01.04.2011
Beiträge: 32
PHP-Kenntnisse:
Fortgeschritten
Quu befindet sich auf einem aufstrebenden Ast
Standard

Jein.
Durch alles in eine Tabelle stopfen habe ich den Vorteil dass das Problem dass Joins nur in eine Richtung gingen gelöst. Ich konnte vorher nicht beim Abfragen der eventtabelle gleich die Daten aus der 2. Tabelle mitnehmen, da die 2. Tabelle durch eine Spalte in der ersten festgelegt war.
Darum ging es mir hier ja primär.
Das locken ist kein Problem, das habe ich anders gelöst, ich bin mir noch nicht sicher ob ich überhaupt nen lock brauche.

Alles in eine Tabelle ist kein Problem, das macht mein Framework relativ transparent.
__________________
"Das Unendliche ist weit, vor allem gegen Ende" - Alphonse Allais
Quu ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
HTML Tabelle Werte ändern -> direkt mit AJAX speichern Atikos JavaScript, Ajax und mehr 3 31.12.2010 01:15
Design einer DB für mehrsprachigkeit Squall Software-Design 35 08.10.2010 13:09
[Erledigt] Intertabellarische Berechnungen, wie? dave303 Datenbanken 13 05.03.2010 11:58
[Erledigt] Ausgabe von mehreren Zeilen einer Tabelle Rutor PHP Tipps 2010 2 22.02.2010 10:05
Referenzen von eine Tabelle in die andere Kopieren wali PHP Tipps 2009 3 13.01.2010 21:53
MY-SQL Abfrage nach Daten aus Tabelle 1 die in Tabelle 2 nicht vorhanden sind triple81 Datenbanken 1 25.12.2009 22:46
Bestehende php /Myqsl Tabelle Neben einander aus geben Totti-Totti PHP Tipps 2009 3 21.12.2009 11:00
Bilder in Tabelle einfügen Mysql oder direkt?! DKuhn PHP Tipps 2009 3 30.09.2009 10:14
tabelle 2 in tabelle 1 updaten steffen_dk Datenbanken 11 04.07.2009 15:04
In einer Abfrage Wert, aus einer anderen Tabelle abfragen? <Daniel> Datenbanken 1 26.10.2006 16:30
Tabelle in Tabelle ausrichten HTML, Usability und Barrierefreiheit 7 03.01.2005 14:32
[Erledigt] Letzter Eintrag in einer Tabelle und Top Five einer Tabelle Datenbanken 2 27.09.2004 06:50
Sortieren anhand einer zweiten Tabelle PHP Tipps 2004 6 20.09.2004 09:03
Sortieren einer Tabelle mit den Werten aus einer anderen Tab Datenbanken 5 04.08.2004 18:09

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
tabelle abhängigkeit, tabellenwerte in abhängigkeit, abhängigkeit tabelle, das unendliche ist weit vor allem gegen ende

Alle Zeitangaben in WEZ +2. Es ist jetzt 12:23 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum