W dniu 2012-06-04 21:22, Marcin pisze:
W dniu 4 czerwca 2012 20:51 użytkownik milekmilekz@gmail.com napisał:
Szybko i pewnie sprawę załatwia zapytanie psql
dzięki, ale czy szybko to bym nie powiedział. na virtualce wykonuje się to
75sekund :( a to bardzo wiele
To zapytanie nie poda wszystkich komputerów. Dla mysql-a () lista wszystkich komputerów spełniających te warunki wygląda tak:
SELECT nodes.id FROM nodes INNER JOIN nodeassignments ON nodes.id = nodeassignments.nodeid INNER JOIN customers ON nodes.ownerid = customers.id INNER JOIN assignments ON nodeassignments.assignmentid = assignments.id WHERE ((assignments.dateto > UNIX_TIMESTAMP(NOW()) OR assignments.dateto = 0 ) AND (assignments.datefrom < UNIX_TIMESTAMP(NOW()) ) AND (nodes.access = 0) AND (nodes.warning = 1) AND nodes.ownerid in (SELECT customerid FROM cash GROUP BY customerid HAVING SUM(value) >= 0 ))
UNION
SELECT nodes.id FROM customers INNER JOIN assignments ON customers.id = assignments.customerid INNER JOIN nodes ON nodes.ownerid = customers.id WHERE ((assignments.dateto > UNIX_TIMESTAMP(NOW()) OR assignments.dateto = 0) AND (assignments.datefrom < UNIX_TIMESTAMP(NOW()) ) AND (nodes.access = 0) AND (nodes.warning = 1) AND nodes.ownerid in (SELECT customerid FROM cash GROUP BY customerid HAVING SUM(value) >= 0 ))
Niestety nie da się tego użyć w jednym zapytaniu do modyfikacji, bo nie można zmieniać tabeli do której odnosi sie zapytanie. - Sypie błędami "You can't specify target table 'nodes' for update in FROM clause" użycie np vnodes nie pomaga - mysql jest zabezpieczony przed tym.
Dodatkowo dla każdego wpisu spełniającego pierwsze 4 warunki wywyoływana jest osobna pętla "(SELECT customerid FROM cash GROUP BY customerid HAVING SUM(value) >= 0 )" która przeliccza całą tabele cash znacznie wydajniejsze było by wrzucenie wyniku zapytania do tablicy tymczasowej.