2017-07-28 2 views
0

Ich habe eine Tabelle artefact_combos:MySQL: alle Kombinationen auswählen, wo erforderliche Anzahl von Kombinations Artikel ist im Besitz

id name       points study_time 
3 Climate Priority Oven   13333 13333 

und weitere artefact_combo_items Angabe Elemente und die Anzahl dieser Elemente erforderlich, um die zu machen artefact_combo:

id  artefact_combo_id thing_id number 
138  3     809   2 
139  3     798   3 
141  3     583   1 

Dann wird eine dritte Tabelle von user_thing:

SELECT * 
FROM `user_thing` 
WHERE (thing_id =809 
OR thing_id =798 
OR thing_id =583) WHERE user_id=4 
LIMIT 0 , 30 

id  user_id thing_id 
3229 4  583   
17756 4  583   

Also in diesem Fall Benutzer 4 hat> = die erforderliche Anzahl der Artikelnummer 583, aber keiner der anderen erforderlichen Elemente, ich würde also erwarten und leeres Ergebnis. Wenn das Ergebnis war:

id  user_id thing_id 
3229 4  583   
156  4  583   
17756 4  789 
17856 4  789 
67756 4  789 
122323 4  809 
434  4  809 

würde ich ein Ergebnis mag gesetzt wie:

id name       points study_time 
3 Climate Priority Oven   13333 13333 

Ich versuche, eine MySQL-Abfrage zu erstellen, die eine Liste von artefact_combos zufließen wird, für die eine bestimmte user_id die erforderliche Anzahl von artefact_combo_items für den artefact_combos hat.

Mein letzter Versuch der letzten vier Stunden war:

SELECT foo.thing_id, 
count(user_thing.id) 
FROM 
(SELECT 
    a.name, 
    c.id, 
    c.artefact_combo_id, 
    c.thing_id, 
    c.number 
FROM artefact_combo_items AS c 
    INNER JOIN user_thing AS b ON b.id = c.thing_id 
    INNER JOIN artefact_combos AS a ON a.id = c.artefact_combo_id 

ORDER BY a.name DESC) AS foo, user_thing WHERE user_thing.id = foo.thing_id 

Ich entschuldige mich, wenn diese Frage zu spezifisch ist oder schlecht erklärt; Ich habe vielleicht mehr abgebissen, als ich gerade bereit bin zu kauen. Jeder Gedanke, jede Andeutung oder jeder Unterricht würde sehr geschätzt werden. Vielen Dank!

+0

Sie scheinen kein Primärschlüssel auf dem dritten Tisch zu haben, möglicherweise Dinge unmäßig schwierig – Strawberry

+1

Ihre Anfrage machen nicht Ihr Schema entsprechen. Vielleicht könntest du diese Seite http://sqlfiddle.com/ benutzen, um ein minimales Beispiel zu erstellen und uns zu sagen, welche Ergebnisse du erwartest –

+0

@Strawberry Danke - Ich habe versucht, die Frage zu ändern, um genauer zu sein, was ich bin tatsächlich zugewandt. –

Antwort

0

ich fragen würde für Combo-Benutzer nicht fehlenden Elemente mit:

SELECT ac.* 
    , u.id user_id 
    FROM artefact_combos ac 
    JOIN (SELECT distinct user_id id 
      FROM user_thing 
     ) u 
    WHERE not exists(SELECT 1 
         FROM artefact_combo_items aci 
         LEFT JOIN (SELECT user_id 
             , thing_id 
             , count(1) cnt 
             FROM user_thing ut 
             GROUP BY user_id 
              , thing_id 
           ) ui 
          ON ui.thing_id = aci.thing_id 
         WHERE aci.artefact_combo_id = ac.id 
         AND ( ui.user_id is null 
          OR ( ui.user_id = u.id 
           and ui.cnt < aci.number 
           ) 
          ) 
       ) 
+0

Hallo @Sal - danke, das ist wirklich toll, scheint zu bekommen, was ich brauche. Es ist langsamer als ich gehofft hatte, um die Abfrage auszuführen, aber mit 3000 Combos, 8000 Combo-Elementen und etwa 7000 Benutzerelementen pro Benutzer bin ich mir nicht sicher, was ich erwartet habe! Nochmals vielen Dank, dass Sie diese Straßensperre unterstützt haben. –