Mehrere LIMITs im JOIN

Strafi

Erfahrenes Mitglied
Hallo,

ich habe mehrere Tabellen

1:

id
inhalt
mehrinhalt


2:

id
inhalt
nochmehrinhalt


3:
id
inhalt
code


Aus Tabelle 1 und 2 erstelle ich einen Datensatz, dieser Datensatz hat aber mehre Einträge in Tabelle 3.

ich möchte aber, das er einfach nur weiß es existiert in Tabelle 3 überhaupt ein Eintrag oder nicht.


Und zum Zweiten

Ist es Möglich einen SQL zu schreiben der zu denn Datensatz alle Datensätze aus Tabelle 3 erfasst und die ein extra Feld einträgt?

Grüße
 
MySQL? Oracle? MS SQL?

1) LEFT JOIN mit Prüfung auf NULL oder EXISTS()
SQL:
SELECT
	t12.*,
	IF(t3.id IS NULL, true, false) AS exist_in_t3
FROM
	(
		-- T1 und T2 zusammen
		SELECT
			id,
			inhalt
		FROM
			t1
		UNION SELECT
			id,
			inhalt
		FROM
			t2
		-- /T1 und T2
	) AS t12
	LEFT JOIN t3
		ON t12.id = t3.id


2) Versteh ich nicht was du mit "zum Zweiten" willst
 
Zuletzt bearbeitet von einem Moderator:
Sorry habe vergessen zu schreiben [ code=mysql ], werde in Zukunft versuchen drauf zu achten.

Zum Zweiten:

ich sitze gerade ein einer Suchausgabe die ich erweitern soll.

Bisher wurde nur die Tabelle 1 und Tabelle 2 verglichenm in ein Array gepackt und dann wurden die Datensätze aus Tabelle 3 geholt, ein neues Feld zu den bestehen Einträgen des Array geschrieben und alle Werte aus der Tabelle 3 mit implode und dem Tennzeichen "," in das neue Feld zu den richtigen vorhandenen Eintrag geschrieben.

Das ist ja auch alles für eine "normale" Suche okay. Doch möchte ich nur nach einen Wert aus der Tabelle 3 suchen, und auch den Eintrag dazu ermitteln, sieht es leider mit dieser Konstruktion bescheiden aus.
 
Fangen wir mal ganz vorne an.
Du kombinierst T1 und T2. Mit einem UNION wie ich es im Beispiel geschrieben habe oder mit einem JOIN?
Wie muss nun die Kombination T1/2 mit T3 verglichen werden. über die ID?
Wie sind die Beziehungen zweischen den Tabellen?
 
Am besten ich strecke mal bisschen Code rein:

Erfassung aller Einträge und Anfrage 1

PHP:
$qry = $db->prepare("
			SELECT
				r.id
			FROM
				tabelle1 r
			LEFT JOIN
				tabelle2 t
			ON
				r.id = t.a_id
			LEFT JOIN
			              tabelle4 u
			ON
				r.user_id = u.id
			".$where."
			ORDER BY
				r.datum DESC
		");
		$qry->execute();
		SmartyPaginate::setTotal($qry->rowCount());

$where enthält meine Suche.


Jetzt die Ausgabe meiner Suchanfrage:
PHP:
$qry = NULL;
		
		$qry = $db->prepare("
			SELECT
				r.datum,
				r.id,
				r.user_id,
				r.name,
				r.vorname,
				r.geschlecht,
				r.geburts_tag,
				r.geburts_monat,
				r.geburts_jahr,
				r.strasse,
				r.hnr,
				r.hb,
				r.hz,
				r.plz,
				r.ort,
				r.zweck,
				t.s42 as frage,
				t.abc as frage2,
				t.kennung as land,
				t.out,
				t.money as ek,
				t.preis as vk,
				t.id as action_id,
				u.linmeld
			FROM
				tabelle1 r
			LEFT JOIN
				tabelle2 t
			ON
				r.id = t.a_id
			LEFT JOIN
				tabelle4 u
			ON
				r.user_id = u.id
			
			".$where."
			ORDER BY
				r.datum DESC
			LIMIT
				".SmartyPaginate::getCurrentIndex().",".SmartyPaginate::getLimit()."
		");
		$qry->execute();

		$requests = $qry->fetchAll();

		if(count($requests)>0) {
			if(count($requests)==1) {
				$request = $requests[0];
				$qry = NULL;
				if($request['id']!='')
					header('Location: index.php?self=est&id='.$request['id']);	
			} else {
				for($i=0;$i<count($requests);$i++) {
					$r=$requests[$i];
					
					$qry = $db->prepare("
						SELECT
							id
						FROM
							tabelle3
						WHERE
							actionid='".$r['action_id']."'
						AND
							tableid='44' 
					");
					
					$qry->execute();
					$stati = $qry->fetchAll();
					$qry = NULL;
					$st=array();
					$additional='';
					for($j=0;$j<count($stati);$j++) {
						$st[] = $stati[$j]['id'];
					}
					$requests[$i]['neuesFeld'] = (count($st)) ? implode(', ', $st) : '';
					
						
				}
			}

Das ist der Alte Stand. Ich werde jetzt oben bei dem ermitteln der Einträge, also bei dem Count mal deines verwenden.

Ich würde ja gern aus die 3. Anfrage verzichten und das nicht mit der Forschleife machen, da ja hier eine suche sich kompliziert gestaltet... ich habe zwar vorläufig noch eine Forschleife gebaut, die den Array $requests noch mal scannt und mir ein neuen array schreibt mit den Einträgen die meiner suche entsprechen. Zum Schluss schreibe ich das dann einfach über den alten $requests-array. Es geht auch Super, aber klar das dann die Anzahl der Einträge von Paginate dann nicht mehr stimmen und mir viel zu viel Abfragen sind.
 
Zurück