Mehrfach auf eine Spalte zugreifen

tvtotal

Erfahrenes Mitglied
Guten Morgen,

ich suche die Lösung zu einem Problem:

Ich möchte mehrfach auf eine Spalte zugreifen und versuche es in der Art:

Bsp: select id from object where objektvalue = x and objektvalue = y ...

Wer hat eine Idee.

Grüße & Danke

tvtotal
 

Yaslaw

n/a
Moderator
Mit AND macht das wenig Sinn. objektvalue ist entweder x oder y, aber nicht beides. Ausser du prüfst über LIKE oder BETWEEN

Falls es wirklich eine AND-Verbindung sein soll, dann ist das was du geschrieben hast genau richtig.

Sollte es eine OR-Verbindung sein, dann gibts bei den meisten Datenbankendas IN
SQL:
SELECT id FROM object WHERE objektvariable IN(x, y)
 
Zuletzt bearbeitet von einem Moderator:

tvtotal

Erfahrenes Mitglied
Hallo,

wenn ich das für den Anfang so in phpmyadmin eingebe, dann zeigt er mir schon einen Fehler an.

Zur Erklärung:

Ich möchte eine Mehrfachauswahl (Filter) realisieren, d.h. über ein Auswahlmenu kommen nacheinander Werte hinzu, die sich in einer Spalte befinden.

Nur wenn die ausgewählten Werte alle dieselbe ID haben, soll das Objekt angezeigt werden. Dabei kann es natürlich mehrere Objekte mit unterschiedlicher ID geben, weil die objektvalues mehrfach vorkommen.

Vielleicht gibt`s dafür ja schon eine Lösung.

Grüße & Danke

tvtotal

Hallo

So, das funktioniert schonmal super: select id from object where objektvalue in(...x,y,z...) (Kann das in() unendlich erweitert werden?)

Wie das nunmal so ist, habe ich damit nur eine Teillösung, denn die objectvalues kommen aus einer anderen Tabelle

Grüße & Danke

tvtotal
 

tvtotal

Erfahrenes Mitglied
Das ist hervorragend: Nun muss ich noch folgendes bewerkstelligen (wie oben erwähnt):

Ich habe 2 Tabellen in einer Datenbank:

Mit select objectid from objekt where objektvalue IN(x,y) ; gibt er (der PC) mir die objectids mit bestimmten objektvalues aus.

Nun soll es aber so sein, dass die objectid nur dann ausgegeben werden soll, wenn die gewählten objektvalues alle zu einer objectid gehören. Wird ein Value gewählt, welches nicht zu der objectid gehört, fällt die komplette objectid weg und wird nicht ausgegeben.

Quasi: Gib mir nur die objectds aus, die alle gewählten objektvalue besitzen. Wird ein objektvalue gewählt, welches nicht zu einer schon ausgegebenen objectid gehört, dann weg damit.

Tab. objekt
+----+------------+----------------+
| id | objectid | objektvalue |
+----+------------+----------------+
| 1 | x1 | 1 |
| 2 | x2 | 2 |
| 3 | x3 | 3 |
| 4 | x2 | 1 |
| 5 | x1 | 2 |
| 6 | x3 | 3 |
| 7 | x1 | 1 |
| 8 | x2 | 2 |
| 9 | x3 | 3 |
+----+------------+----------------+

Die übrig bleibenden objectids sollen dann in einer weiteren Abfrage verwendet werden, um die Objekte abzurufen.

Ich hoffe, dass

1. man das versteht und
2. vielleicht jemand eine Idee hat

Grüße & Danke

tvtotal
 
Zuletzt bearbeitet:

Yaslaw

n/a
Moderator
Falls du mit MySQL arbeitest, geht das folgende SQL
SQL:
SELECT 
	objectid
FROM
	(
		-- Die objectid Gruppieren
		SELECT
			objectid,
			-- Alle obetvalues zu einer Liste mit Komma getrennt zusammenführen
			GROUP_CONCAT(DISTINCT objektvalue SEPARATOR ',') AS ovalues
		FROM
			objekt
		GROUP BY objectid
	) AS dat
WHERE
	 -- Pro gesuchter Wert hier eine Bedinung mit FIND_IN_SET anwenden
	FIND_IN_SET('1', ovalues) 
	AND FIND_IN_SET('3', ovalues);
 
Zuletzt bearbeitet von einem Moderator:

tvtotal

Erfahrenes Mitglied
Hallo,

das ist genial und beneidenswert. Es funktioniert und wenn ich es richtig verstehe, muss ich also bei jedem hinzukommenden Wert jeweils AND FIND_IN_SET('neuer_wert', ovalues) hinzufügen? Ok, das macht man wohl in einer Schleife und das krieg ich hoffentlich hin.

Jetzt kommt es aber:

Nun muss ich mit den gefilterten objectids eine 2 Tabelle (objectwerte) ansteuern, um gezielt die objecte ausgeben zu können.

Tab. objectwerte
+----+------------+----------------+
| objectid | objectname| objectmulti |
+----+------------+----------------+
| 1 | x1 | 1 |
| 2 | x2 | 2 |
| 3 | x3 | 3 |
| 4 | x2 | 1 |
| 5 | x1 | 2 |
| 6 | x3 | 3 |
| 7 | x1 | 1 |
| 8 | x2 | 2 |
| 9 | x3 | 3 |
+----+------------+----------------+

Wie kann ich denn die beiden Abfragen verbinden? Dann wäre mein Wochenende gerettet und ich kann Fussball schauen.

Grüße & Danke

tvtotal
 

Yaslaw

n/a
Moderator
Da ich Fussball nicht mag, sollte ich dich eigentlich mit SQL binden....

Da du keine weiteren Felder aus der Abfrage brauchst, würde ich diese als Kriterium mitgeben

SQL:
SELECT *
FROM table1
WHERE id IN (SELECT id FROM table2)

Das SELECT id FROM table2 ist das SQL dass ich dir vorhin gepostet habe
 
Zuletzt bearbeitet von einem Moderator:

tvtotal

Erfahrenes Mitglied
Hallo,

Bundesliga nein, aber die WM schaue ich mich schon gerne an.

Aber zum Thema. Das funktioniert wieder perfekt.

Das war eine klasse Hilfestellung.

VIELEN LIEBEN DANK

tvtotal