Witam,
Mam tabele w której jest ponad 500 tys rekordow, które wyglądają tak:
id: | userid: | course: | element: | value:
1 | 2 | 45 | status | passed
2 | 2 | 45 | score | 96
3 | 3 | 56 | status | incomplete
4 | 4 | 54 | status | failed
5 | 4 | 54 | score | 30
6 | 3 | 56 | score | 67
Potrzebuję najpierw wybrać który user w którym course ma element='status' i value='passed' albo 'failed', a następnie, jeśli ma 'passed' albo 'failed' w danym kursie, wypisać value gdy element='score' w tym course.
Trochę to zawiłe ale mniejwięcej tak to wygląda
Dzięki!
1. Masz zrypaną strukturę bazy na pierwszy rzut oka.
2. Zapytanie, które wyciągnie dane w "normalnej" formie:
SELECT a.id, a.userid, a.course, a.value AS STATUS, b.value AS score FROM tbl_name a JOIN tbl_name b ON a.userid = b.userid AND a.course = b.course AND b.element = 'score' WHERE a.element = 'status' AND a.value IN('passed', 'failed');
Super, działa! Dzięki!
A czy dałoby się do tego jeszcze dołożyć wypisywanie tylko tych rekordów, których nie ma już w innej tabeli?
Generalnie jest tak, że pierwsze zapytanie wyszukuje rekordy (tak jak w poście powyżej) i wrzuca je do tabeli 'report'. A teraz chciałbym, żeby do tabeli 'report' dopisywane były tylko te rekordy, których tam jeszcze nie ma. Czyli powyższa kwerenda + LEFT JOIN? tylko jak
?
... WHERE ... AND a.id NOT IN(SELECT id FROM other_table);
no właśnie id mi nie kopiuje z oryginalnej tabeli... musiałoby by być
...WHERE...AND a.userid NOT IN (SELECT userid FROM report) AND a.course NOT IN (SELECT course FROM report)... ale i tak jak dojdę do value TO nie pójdzie bo mam już wcześeniej a.value IN ('passed', 'failed') a musiałoby BYć a.value NOT IN (SELECT value FROM report)
Napisz na podstawie jakich kolumn określasz czy dany rekord powinien zostać skopiowany czy nie. Być może chodzi o coś takiego?
... WHERE ... AND (a.userid, a.course) NOT IN(SELECT userid, course FROM other_table);
Dokładnie chce sprawdzać po 'course', 'value', 'userid'. Jeśli taki rekord istnieje w tabeli 'report', pomija go. Chodzi o to, że w pierwszej tabeli np. score może się zmienić - ktoś miał 90, a zmieniło mu się na 100 i chciałbym, żeby w tej drugiej tabeli (report) były wtedy 2 rekordy.
Próbowałem tak jak pisałeś w ostatnim poście, ale jakby w ogóle nie wziął pod uwagę tego warunku... wyświetla wszystkie rekordy...
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)