SQLLite Abfrage Problem

SCIPIO-AEMILIANUS

aka Dubdidadu
Moin.
Ich hab irgendwo den Wurm in meiner doch eher simplen SQL-Abfrage. Ich habe 2 Tabellen die ungefähr wie folgt aussehen:

Tabelle: table_pupil
_id_stringid_firstname_lastname
1asdf1vorname1nachname1
2asdf2vorname2nachname2
3asdf3vorname3nachname3
4asdf4vorname4nachname4

Tabelle: table_images
_id_stringid_people
1img1asdf4,asdf3,asdf2
2img2asdf1,asdf3

Mit folgender Abfrage:
Code:
SELECT p._stringid, p._firstname, p._lastname, i._stringid AS imageid FROM table_pupil AS p LEFT JOIN table_images AS i ON i._people LIKE '%'+p._stringid+'%' WHERE p._stringid='"+id+"' ORDER BY p._lastname ASC, p._firstname ASC

versuche ich zu allen Einträgen aus der ersten Tabelle deren _stringid gleich id ist ALLE _stringid's der zweiten Tabelle hinzufügen(falls vorhanden), deren Spatle _people die _stringid der ersten Tabelle enthält.

Also am Beispiel id=asdf1 sollte dann zurückkommen:
_stringid_firstname_lastnameimageid
asdf1vorname1nachname1img2

Ich hoffe meine Erklärung ist einigermaßen ausreichend.
Mein Problem ist jetzt, dass die alle Spalten richtig ausgegeben werden jedoch nicht die imageid Spalte, die immer null ist.
Was mach ich bei meiner Abfrage falsch? Ich tippe ja irgendwie auf den Join-Abschnitt.
 
So ich hab ein wenig weiter probiert und mein neuer Abfrage Versuch ein wenig ordentlicher sieht jetzt so aus:
Code:
SELECT p._firstname as firstname, p._stringid AS pupilid, p._lastname as lastname, i._stringid AS imageid 
FROM
( select  _firstname, _stringid, _lastname from table_pupil 
WHERE _stringid='"+id+"'
ORDER BY _lastname ASC, _firstname ASC 
) AS p
LEFT JOIN
( select _stringid, _people
from table_images
) AS i 
ON '%'+p._stringid+'%' LIKE i."+COLUMN_PEOPLE

Jedoch immer noch mit dem selben Ergebnis, sodass die imageid Spalte immer noch null ist.
 
Als erstes mal dein Query in lesbarer Form
SQL:
SELECT 
	p._firstname as firstname, 
	p._stringid AS pupilid, 
	p._lastname as lastname, 
	i._stringid AS imageid 
FROM
	(
		SELECT
			_firstname, 
			_stringid, 
			_lastname
		FROM
			table_pupil 
		WHERE 
			_stringid='"+id+"'
		ORDER BY 
			_lastname ASC, 
			_firstname ASC 
	) AS p
	LEFT JOIN
	(
		SELECT
			_stringid,
			_people
		FROM
			table_images
	) AS i 
		ON '%'+p._stringid+'%' LIKE i."+COLUMN_PEOPLE

So, bei MySQL würde ich FIND_IN_SET() nehmen. Das gibts laut meiner Google-Suche in SQL Lite nicht. Am besten würdest du das ganze normalisieren

Neu: Tabelle: table_pupil_images
_pupil_id_images_id
12
21
31
32
41

In der Tabelle table_images die Spalte _people entfernen

Dann geht das nachher realtiv einfach
SQL:
SELECT 
	p._firstname as firstname, 
	p._stringid AS pupilid, 
	p._lastname as lastname, 
	i._stringid AS imageid 
FROM
	table_pupil AS p
	LEFT JOIN table_pupil_images AS pi
		ON p._id = pi._pupil_id
	LEFT JOIN table_images AS i
		ON pi._images_id = i._id;
 
Zuletzt bearbeitet von einem Moderator:
Irgendwie funktioniert meine Abfrage, wenn ich die Modulos weglasse aber das ist mir zu suspekt.
Ich werd es dann wohl, wie du es vorgeschlagen hast mit den 3 Tabellen machen. Ich hatte mich zunächst dagegen entschieden, da lediglich in nur 10% der Fälle mehr als eine pupil_id in people hinterlegt ist.

Vielen Dank für den soweit vorgefertigten Query!
 
Zurück