Zapytanie dziala ale widocznie przy takiej liczbie rekordow jest jeszcze gorsze niz z JOIN'em
Czyli dodajesz to tabeli kolumne:
ALTER TABLE `tabela` ADD COLUMN `sortowanie` VARCHAR(10) AFTER `arkusz_id`;
i zaloz na niej index!!!
Rozumiem ze masz juz jakas baze wiec trzeba teraz we wszystkich rekordach uzupelnic kolumne sortowanie. Mozna to zrobic jednym zapytaniem.
Nie wiem ile ono bedzie sie wykonywalo...
UPDATE tabela t, (SELECT * FROM tabela WHERE kolumna = 2) AS tab
SET t.sortowanie = tab.wartosc
WHERE t.wiersz = tab.wiersz AND t.arkusz_id=tab.arkusz_id
Jesli ta aktualizacja wykonalaby sie w miare szybko to wystarczyloby tylko aktualizowac ta kolumne przed zapytaniem zwracajacym posortowane elementy
To zapytanie sortowania teraz wyglada tak
SELECT * FROM tabela ORDER BY sortowanie, wiersz, arkusz_id, kolumna
Jezeli jednak zapytanie z update'm wszystkich elementow bedzie dlugo trwalo to trzeba teraz przy kazdej modyfikacji jakiegos rekordu updatowac w nim kolumne sortowanie, dla przykladu po zmienie rekordu 13 trzeba by wykonac taka operacje
UPDATE tabela t, (SELECT * FROM tabela WHERE kolumna = 2) AS tab
SET t.sortowanie = tab.wartosc
WHERE t.id = 13 AND t.wiersz = tab.wiersz AND t.arkusz_id=tab.arkusz_id
Nie wiem jak z czasem wykonania tego zapytania i jezeli mimo tego ze chodzi o jeden element jest duzy trzeba go rozbic na 2 zapytania
na poczatku pobrac dane rekordu 13 (wiersz i arkusz_id) a potem zrobic update'a
1)
SELECT wiersz, arkusz_id FROM tabela WHERE id = 13
2) ($wiersz i $arkusz_id sa wartosciami pobranymi z zapytnia 1)
UPDATE tabela t, (SELECT * FROM tabela WHERE wiersz = $wiersz AND arkusz_id = $arkusz_id AND kolumna = 2) AS tab
SET t.sortowanie = tab.wartosc
WHERE t.id = 13
mozna to drugie zapytanie jeszcze bardziej rozbic ale to tylko jesli to by znowu bylo za wolne
po rozbiciu napewno bedzie szybkie
czyli: 1) jedynka pozostaje taka sama
2) ($wiersz i $arkusz_id sa wartosciami pobranymi z poprzedniego zapytania)
SELECT wartosc FROM tabela WHERE wiersz = $wiersz AND arkusz_id = $arkusz_id AND kolumna = 2
3) (i ta otrzymana $wartosc wstawiasz do update
UPDATE tabela
SET t.sortowanie = $wartosc
WHERE id = 13
No i jeszcze na koniec metoda wstawiania nowego rekordu zeby od razu byla uzupelniana kolumna sortowanie
Jesli wstawiasz wiersz w ktorym kolumna jest = 2 to wtedy warunek if ustwia kolumne sotowanie na wlasnie podawana wartosc a jesli jesli jest inna niz 2 to szuka wiersza w ktorym jest taki wiersz i arkusz id i kolumna = 2 i pobiera wartosc ktora pozniej wstawi w miejsce sortowania dla nowo dodawaneo wpisu
INSERT INTO tabela (wiersz,kolumna,wartosc,arkusz_id,sortowanie) SELECT $wiersz,$kolumna,$wartosc,$arkusz_id, (SELECT IF($kolumna=2,$wartosc,wartosc) FROM TABLE WHERE wiersz=$wiersz AND arkusz_id=$arkusz_id AND kolumna = 2)
Wazne ze najpierw musisz wstawic rekord z kolumna = 2 i dopiero nastepne ktore maja wiersz i arkusz_id takie same. Jesli nie to musz potem poprawic wszystkie rekordy gdzie bedzie w sortowanie NULL
Mam nadzieje ze cos z tego rozumiesz bo ja coraz mniej
w razei czego zapraszam na gg (w profilu)
pozdrawiam...