SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Websites optimieren für Google & Co.

Websites optimieren für Google & Co. zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 08.01.2012, 21:47:30
droehn droehn ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 51
Beiträge: 19
JOIN ON (a,b,c) = (d,e,f,g) - wie geht das?

Moin allerseits,

Hoffentlich war der Titel nicht zu verwirrend, aber ich weiss einfach nicht, mit welchen Worten die Sache am Besten zu beschreiben ist ;-).

Für eine Artikelzuordnung und -abfrage nach Gruppen speichere ich Letztere in einer Nested Set Struktur und ordne in einem zweiten Schritt die Artikel der 'gruppe'-id zu:

Code:
Tabelle 'artikel'          		    Tabelle 'gruppe'
id   |   artikel      |   gruppeid          id   |   titel   |   links   |   rechts
1    |   Rosinenbrot  |   2                 1    |   Gebäck  |   1       |   6
2    |   Rosinenbrot  |   6                 2    |   Brot    |   2       |   3
3    |   Apfelkuchen  |   3                 3    |   Kuchen  |   4       |   5
4    |   Apfelkuchen  |   5                 4    |   Frucht  |   6       |   14
5    |   Gugelhupf    |   3                 5    |   Apfel   |   7       |   12
6    |   Gugelhupf    |   6                 6    |   Rosine  |   8       |   9
7    |   Eiffeltorte  |   3                 7    |   Birne   |   10      |   11
8    |   Eiffeltorte  |   5                 8    |   Kirsche |   12      |   13
9    |   Eiffeltorte  |   7

Wenn der Anwender nun alle Erzeugnisse mit Rosinen sehen möchte, würde es reichen, dem Statement die Gruppen-ID zu übergeben. Da aber auch eine Suche nach allen Erzeugnissen mit Früchten möglich sein muss, würde die Gruppen-ID 4 übergeben werden, was auf der Artikel-Tabelle nirgends verzeichnet ist. Daher übergebe ich immer die Werte für 'links' und 'rechts', um zunächst die möglichen ID-Nummern auf der 'gruppe' Seite einzugrenzen. Für 'Frucht' sähe das so aus

Code:
SELECT
   a.artikel
FROM
   artikel AS a
LEFT JOIN 
   gruppe AS b
ON (
      (
         6 >= b.links
      AND
         14 <= b.rechts
      AND
         b.id = a.gruppeid
      )
   )
GROUP BY
   a.artikel
Auch soweit wäre das kein Problem. Wenn der Anwender jetzt alle Brote mit Früchten sehen möchte, wird's allerdings schwierig. Ich versuche schon den ganzen Tag lang die Eingrenzung zu kombinieren, kriege aber bestenfalls alle Brote angezeigt - allerdings auch die ohne Früchte.

Ich hatte die Hoffnung, mittels GROUP_CONCAT erstmal alle gewünschten IDs aus 'gruppe' einzugrenzen (Brot, Frucht, Apfel, Rosine, Birne, Kirsche) und dagegen GROUP_CONCAT 'gruppeid' aus 'artikel' vergleichen zu können:

Code:
Gruppe:                      gruppe.id
'alle Brote mit Früchten'    (2,4,5,6,7,8)

Artikel:               artikel.gruppeid
Rosinenbrot            (2,6)          ja!
Apfelkuchen            (3,5)          nein, keine 3
Gugelhupf              (3,6)          nein, keine 3
Eiffeltorte            (3,5,7)        nein, keine 3
Also etwa so:
Code:
SELECT
	a.artikel
FROM
	artikel AS a
WHERE
	a.gruppeid IN
		(
			SELECT
				GROUP_CONCAT(b.id SEPARATOR ',')
			FROM
				gruppe AS b
			WHERE
				(
					2 >= b.links
				AND
					3 <= b.rechts
				)
			OR
				(
					6 >= b.links
				AND
					14 <= b.rechts
				)
		)
Offenbar ist so ein Vergleich in MySQL nicht möglich. In der Zwischenzeit brummt mir der Schädel und bevor ich hier zum Fenster rausspringe, wollte ich hier mal nachfragen, ob sich jemand mit diesem Problem schon einmal auseinandergesetzt hat oder auf andere wunderbare Weise mir einen Tip geben kann.

Vielen Dank und bis denne!
David

Geändert von droehn (08.01.2012 um 22:13:55 Uhr)
Mit Zitat antworten
  #2  
Alt 09.01.2012, 11:41:00
derNichtGlaubt derNichtGlaubt ist offline
Anfänger
 
Registriert seit: Jul 2011
Alter: 65
Beiträge: 45
AW: JOIN ON (a,b,c) = (d,e,f,g) - wie geht das?

Hi!
Dein Problem sind die zwei Tabellen, die keine saubere Lösung darstellen.
Dein Problem vereinfacht sich schlagartig, wenn Du eine dritte Tabelle erstellst.
In dieser Tabelle trägst Du alle bestehenden Kombinationen Artikel<>Gruppe ein,
z.B. so:

ID | ID-Gruppe | ID-Artikel

über diese Tabelle kannst Du dann alle Artikel zu einer Gruppe
bzw. alle Gruppen zu einem Artikel finden.

lg
Mit Zitat antworten
  #3  
Alt 09.01.2012, 14:22:49
droehn droehn ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 51
Beiträge: 19
AW: JOIN ON (a,b,c) = (d,e,f,g) - wie geht das?

Moin und danke für die Antwort.

Die Tabelle 'artikel' ist eigentlich schon diese dritte Tabelle - tausche Spalte 'artikel' durch 'artikelid' aus:

Code:
Tabelle 'artikel'          		    Tabelle 'gruppe'
id   |   artikelid    |   gruppeid          id   |   titel   |   links   |   rechts
1    |   10           |   2                 1    |   Gebäck  |   1       |   6
2    |   10           |   6                 2    |   Brot    |   2       |   3
3    |   11           |   3                 3    |   Kuchen  |   4       |   5
4    |   11           |   5                 4    |   Frucht  |   6       |   14
5    |   12           |   3                 5    |   Apfel   |   7       |   12
6    |   12           |   6                 6    |   Rosine  |   8       |   9
7    |   13           |   3                 7    |   Birne   |   10      |   11
8    |   13           |   5                 8    |   Kirsche |   12      |   13
9    |   13           |   7
Ich habe lediglich der übersichtlicheren Darstellung meiner Frage halber Artikelnamen statt IDs vergeben. Das Problem bleibt sich gleich:

Wie muss ich die Abfrage gestalten, um die artikelid's auszufiltern, deren SÄMTLICHE gruppeid's in der Resultatmenge der id's aus 'gruppe' enthalten sind?

Code:
ZEIGE 
   'artikel.artikelid'
WO 
   'artikel.gruppeid' (2 UND 6)
IN
   'gruppe.id' (2,4,5,6,7,8)
Danke und bis denne
David
Mit Zitat antworten
  #4  
Alt 09.01.2012, 16:21:25
derNichtGlaubt derNichtGlaubt ist offline
Anfänger
 
Registriert seit: Jul 2011
Alter: 65
Beiträge: 45
AW: JOIN ON (a,b,c) = (d,e,f,g) - wie geht das?

z.B. ungefähr so:

Artikel, Gruppen und Zuordnung seien die Tabellen

PHP-Code:
$G 'Brot'// z.B. es seien alle Artikel, die u.A. zur Gruppe Brot gehören, gesucht
$R mysql_query("SELECT A.titel FROM Artikel as A, Gruppen as G, Zuordnung as Z WHERE G.titel = $G AND G.id = Z.gruppenid AND Z.artikelid = A.id"); 
lg
Mit Zitat antworten
  #5  
Alt 09.01.2012, 16:43:48
droehn droehn ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 51
Beiträge: 19
AW: JOIN ON (a,b,c) = (d,e,f,g) - wie geht das?

Ja, für eine einfache Abfrage mag das gehen - das habe ich in meiner Erläuterung zur Problemstellung bereits beschrieben.

Die Frage lautet: Wie grenze ich die Ausgabe der Artikel ein, wenn der Anwender nur alle Brote mit Früchten sehen möchte?

Alle Brote = Gruppe.id(2)
Alle Früchte = Gruppe.id(4,5,6,7,8)

Unter den Artikeln darf nur 'Rosinenbrot' ausgegeben werden, weil nur dieser sowohl der Gruppe.id 2 als auch 6 zugeordnet ist

Vergiss nicht, die Gruppe ist in einem Nested Set angelegt - der Knoten 'Früchte' mit der ID 4 ist in keinem Fall den Artikeln zugeordnet sondern nur - in diesem Beispiel - 'Rosine' mit der ID 6. Die Abfrage lautet aber 'alle Früchte' - das Nested Set umschliesst darin sämtliche Knoten, die zu 'Früchte' gehören.

Nun denn, trotzdem vielen Dank für Deine Mühen.
Grüsse
David
Mit Zitat antworten
  #6  
Alt 09.01.2012, 18:01:39
derNichtGlaubt derNichtGlaubt ist offline
Anfänger
 
Registriert seit: Jul 2011
Alter: 65
Beiträge: 45
AW: JOIN ON (a,b,c) = (d,e,f,g) - wie geht das?

Sorry, bin manchmal langsam von Begriff!

Wenn Du Frucht als Überbegriff/-gruppe hast, wie übrigens auch Gebäck,
haben diese Begriffe nichts in der jetzigen Gruppen-Tabelle verloren.
Diese Überbegriffe müssen in eine eigene Tabelle ausgelagert und
die jetzigen Gruppenbegriffe mittels einer weiteren Tabelle diesen
Überbegriffen zugeordnet werden.

Damit kannst Du dann z.B. die einzelnen Früchte der Übergruppe "Frucht" ermitteln, und gehst mit dem Ergebnis in die eigentliche Abfrage
(entweder mittels subqueries oder Du stellst die eigentliche query in eine z.B. "foreach"-Schleife).
Ich finde die Beispiele hier -> http://dev.mysql.com/doc/refman/5.0/en/subqueries.html ganz brauchbar

hoffe dies kann Dir zumindest als Anregung dienen ... ;-)
Mit Zitat antworten
  #7  
Alt 09.01.2012, 22:11:22
droehn droehn ist offline
Anfänger
 
Registriert seit: Oct 2010
Alter: 51
Beiträge: 19
AW: JOIN ON (a,b,c) = (d,e,f,g) - wie geht das?

Auch nicht :-) - aus verschiedenen Gründen.
Das Nested Set dient dem dynamischen Aufbau einer Baumstruktur und kann beliebig erweitert, sortiert, umstrukturiert oder gekürzt werden - ohne die Referenzen von anderen Tabellen zu zerstören und unabhängig davon, wieviele Dimensionen benötigt werden. Würde ich jeden Unterknoten in eine separate Tabelle auslagern, geht diese Dynamik flöten (Unterknoten können wiederum ihrerseits Unterknoten haben). Ausserdem weiss der MySQL-Query bei der Abfrage nicht, ob jetzt die Gruppe 'Früchte' in Tabelle1, das Element 'Rosine' in Tabelle2 oder die Eigenschaft 'kandiert' in Tabelle3 - oder eine Kombination aller - gefordert ist. An der Tabellenstruktur gibt es also nichts zu häkeln.

Nix für ungut, aber ich werde mich mal ein Haus weiter bewerben.

Danke für die Mühen und Grüsse
David
Mit Zitat antworten
  #8  
Alt 10.01.2012, 04:00:25
Ckaos Ckaos ist offline
Member
 
Registriert seit: Nov 2007
Beiträge: 843
AW: JOIN ON (a,b,c) = (d,e,f,g) - wie geht das?

Hi

damit ich dir helfen kann gebe bitte die "richtige" Tabellenstruktur("SHOW CREATE TABLE") inkl. testdaten("INSERTS") an , sowie das gewünschte Ergebnis. Mit gekürzten oder zur vereinfachung umstrukturierten Tabellen kommen wir hier nicht weiter.
Und ich habe nicht die Zeit mir das mal eben schnell nach zu bauen!
Ich hoffe "links" und "rechts" sind keine echten Spaltenbezeichner ;)

mfg

CKaos
__________________
"Wenn die Leute Häuser so bauen würden, wie wir Programme schreiben, würde der erstbeste Specht unsere Zivilisation zerhacken."
In den allermeisten Fällen sitzt der Bug etwa 40 cm vor dem Monitor!
Mit Zitat antworten
Antwort

Stichworte
eingrenzung, mysql, select


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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 aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Hilfe beim Tunen von MySQL Statements erbeten Balael MySQLi/PDO/(MySQL) 2 26.06.2011 19:25:18
LEFT JOIN Problematik x_merlin_x MySQLi/PDO/(MySQL) 0 18.05.2010 11:49:18
Zwei Aggregatfunktionen in JOIN über drei Tabellen Nico #949494 MySQLi/PDO/(MySQL) 1 29.03.2007 14:47:58
Performance bei Abfrage inner join Tikiwiki MySQLi/PDO/(MySQL) 7 21.02.2006 08:46:50
mysql query mit Join problem Silencer PHP für Fortgeschrittene und Experten 4 18.03.2003 15:38:31


Alle Zeitangaben in WEZ +2. Es ist jetzt 20:40:53 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt