MySQL Abfrage Wichtig !

Slavam

Grünschnabel
Hallo, Jungs ich habe in mySQL 3 Tabellen

Parameter (Par_Nr, Par_ID, Engl_Name, Deu_Name)
Bezug (Par_Nr, SchlagW_Nr)
SchlagW (SchlagW_Nr, SchlagW_Name)

so ist nicht schwehr.

Info:
Parameter bekommen verschiedene Schlagwörter zugewiesen (über die Bezug Tabelle) ein Parameter kann einen oder auch mehrere Schlawörter besitzen. Über mehrere Chackboxen werden die Schlagwörter angeklickt und es werden die Parameter angezeigt die diese Schlagwörter haben.

Frage:
wenn ich bei UMTS (Schlagwort) ein häckhen mache, werden alle Parameter angezeigt die nur UMTS als Schlagwort haben oder UMTS und irgend welche andere. Wenn ich jetzt ein Häckhen bei UMTS und bei BSS mache, solle die Parameter angezeigt werden die MINDESTENS beides haben UMTS und BSS ! die Parameter die nur UMTS oder nur BSS haben sollen in dem Fall nicht angezeigt werden. Und wenn ich noch bei irgend einem dritten Schlagwort ein häckhen mache, sollen die Parameter angezeigt werden die mindestens diese 3 Schlagwörter haben.
Wie sieht die richtige Abfrage aus ? (das mit Chackboxen kriege ich noch hin bitte schreiben Sie mir erst nur die mySQL Abfrage für UMTS und BSS)


die Abfrage die ich habe ist nicht gans richtig, da bei dieser werden auch die Parameter angezeigt die als Schlagwort nur UMTS haben und kein BSS, und es sollen die Angezeigt werden die mindestens die beiden parameter haben UMTS und BSS.


SELECT
`parameter`.`Par_ID` , `parameter`.`Engl_Name`, `parameter`.`Deu_Name` , `schlagw`.`SchlagW_Name`

FROM `parameter`
INNER JOIN `bezug` ON ( `parameter`.`Par_Nr` = `bezug`.`Par_Nr` ) INNER JOIN `schlagw` ON ( `bezug`.`SchlagW_Nr` = `schlagw`.`SchlagW_Nr`)
WHERE(`schlagw`.`SchlagW_Nr` = 1) OR (`schlagw`.`SchlagW_Nr` = 19)


es ist sehr wichtig !

VIELEN DANK !
 
AND statt OR und fertig ist... :-)

...also nicht wo das eine oder das andere zutrifft, sondern wo das eine und das andere zutrifft.
 
ja mit AND habe ich auch versucht, aber es wird garnichts angezeigt, und wenn s auch funktionieren würde, dann werden nur die parameter angezeigt die UMTS UND BSS haben, aber ich möchte dass die Parameter angezeigt werden die MINDESTENS die beiden Schlagwörter haben, denn es gibt Parameter die 4 oder 5 Schlagwörter haben, und bei der Abfrage werden nur die angezeigt die genau 2 Schlagwörter haben UMTS und BSS. :-(((
 
Original geschrieben von Slavam
ja mit AND habe ich auch versucht, aber es wird garnichts angezeigt
Stimmt, deine Tabelle Sieht ja nach dem Join so aus:
Name Schagwnummer
-----------------------------------
abc 1
abc 2
abc 4
def 2
def 3
...
Da hast du natürlich bei keinem Datensatz beide Bedingungen erfüllt. God bless me :-(
Original geschrieben von Slavam
, und wenn s auch funktionieren würde, dann werden nur die parameter angezeigt die UMTS UND BSS haben, aber ich möchte dass die Parameter angezeigt werden die MINDESTENS die beiden Schlagwörter haben, denn es gibt Parameter die 4 oder 5 Schlagwörter haben, und bei der Abfrage werden nur die angezeigt die genau 2 Schlagwörter haben UMTS und BSS. :-(((
Nein, es werden auch die mit mehr Sclagwörtern angezeigt, da SQL nur prüft, ob die beiden vorhanden sind - alles andere interessiert nicht. Wenn da also noch mehr Schlagwörter existieren, ist das "egal"...

Dürfte nicht der eleganteste Weg sein, aber so sollte es gehen:
PHP:
SELECT 
`parameter`.`Par_ID` , `parameter`.`Engl_Name`, `parameter`.`Deu_Name` , `schlagw`.`SchlagW_Name` 
FROM `parameter` 
INNER JOIN `bezug` ON ( `parameter`.`Par_Nr` = `bezug`.`Par_Nr` ) INNER JOIN `schlagw` ON ( `bezug`.`SchlagW_Nr` = `schlagw`.`SchlagW_Nr`) 
WHERE(SELECT COUNT(*) FROM Bezug b WHERE `parameter`.`Par_Nr` = `b`.`Par_Nr` AND ((`schlagw`.`SchlagW_Nr` = 1) OR (`schlagw`.`SchlagW_Nr` = 19)))>=2
Ist übrigens ein correlated Subselect.
Das >=2 kannst du auch nur mit =2 schreiben, wenn deine Bezugsschlüssel zusammen UNIQUE sind (also z.B. als PrimaryKey definiert sind).
 
Vielen Dank ! ich habe es genau so kopiert aber es klappt nicht, was soll ich in der Zeile verändern ? was heisst Bezug b ?

WHERE(SELECT COUNT(*) FROM Bezug b WHERE `parameter`.`Par_Nr` = `b`.`Par_Nr` AND ((`schlagw`.`SchlagW_Nr` = 1) OR (`schlagw`.`SchlagW_Nr` = 19)))>=2

ah soo b ist nur alias ? die Abfrage funktioniert so wie die ist, trotzdem nicht :-(

Danke !
 
Zuletzt bearbeitet:
Ups, was ein Pfusch von mir... :rolleyes:
Das kommt wieder, wenn man wenig Zeit hat...
Das konnte ja so auch nicht klappen.

So sollte es jetzt aber gehen (Änderung fett):

SELECT
`parameter`.`Par_ID` , `parameter`.`Engl_Name`, `parameter`.`Deu_Name` , `schlagw`.`SchlagW_Name`
FROM `parameter`
INNER JOIN `bezug` ON ( `parameter`.`Par_Nr` = `bezug`.`Par_Nr` ) INNER JOIN `schlagw` ON ( `bezug`.`SchlagW_Nr` = `schlagw`.`SchlagW_Nr`)
WHERE(SELECT COUNT(*) FROM Bezug b WHERE `parameter`.`Par_Nr` = `b`.`Par_Nr` AND ((`b`.`SchlagW_Nr` = 1) OR (`b`.`SchlagW_Nr` = 19)))>=2

Ist immer schlecht, wenn man es nicht selbst testen kann.

*edit*:
ah soo b ist nur alias ?
Ja, b ist nur ein alias für diesen Tabellenbezug, da es eben einen Unterschied macht, ob du dich auf die Tabelle im äußeren Select (da steht während des Subselects nur ein Wert drin) oder die im inneren (berücksichtigt die gesamte Tabelle) beziehst.
 
Zuletzt bearbeitet:
Zurück