Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zapytanie sprawdzające pola z polami w rekordach
alek12
post 16.01.2013, 14:10:40
Post #1





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 16.01.2013

Ostrzeżenie: (0%)
-----


Witam was mam takie zapytanie :


  1. SELECT DISTINCT x1.id FROM
  2. (
  3. SELECT id,a AS val FROM dane
  4. UNION ALL SELECT id,b FROM dane
  5. UNION ALL SELECT id,c FROM dane
  6. UNION ALL SELECT id,d FROM dane
  7. UNION ALL SELECT id,e FROM dane
  8. UNION ALL SELECT id,f FROM dane
  9. ) x1 INNER JOIN
  10. (
  11. SELECT id,a AS val FROM dane
  12. UNION ALL SELECT id,b FROM dane
  13. UNION ALL SELECT id,c FROM dane
  14. UNION ALL SELECT id,d FROM dane
  15. UNION ALL SELECT id,e FROM dane
  16. UNION ALL SELECT id,f FROM dane
  17. ) x2 ON x1.val = x2.val AND x1.id <> x2.id
  18. GROUP BY x1.id,x2.id HAVING count(1) = 6"



Zapytanie to ma sprawdzać pola wszystkich rekordów tzn mamy :

1 2 3 4 5 6
6 5 4 3 2 1
1 2 3 4 5 7


Zapytanie bierze pierwszy rekord a dokładnie jego pola i sprawdza 1 z 6,5,4,3,2,1 potem bierze 2 i sprawdza z 6,5,4,3,2,1 potem 3 i sprawdza z 6,5,4,3,2,1 jeśli wszystkie wartości są w sprawdzanym rekordzie to go wypisuje. Potem pobiera następny rekord w naszym przypadku 6,5,4,3,2,1 i sprawdza jego wartości z rekordem 1 i 2. W naszym wypadku powinno wypisać rekordy :

1 2 3 4 5 6
6 5 4 3 2 1

ponieważ wszystkie wartości z rekordu 1 2 3 4 5 6 są w rekordzie 6 5 4 3 2 1 i na odwrót. Lecz rekord 1 2 3 4 5 7 nie wypisuje ponieważ nigdzie w pozostałych dwóch rekordach nie ma 7.


Zapytanie chodzi super, lecz problem jest w tym że jeśli baza przybiera na rozmiarze to niestety czas wykonywania takiego zapytania jest ekstremalnie długi nawet 40 minut (mowa o 6 tyś rekordach).


Robiłem też to od strony programowej w dwa sposoby :

1. Pętla w pętli każdy rekord jest sprawdzany przez rekord. Tzn mamy pierwszy rekord to pola z tego rekordu sprawdzane są w polach następnych rekordów , jeśli wartości znajdą się to dodaje mi dane rekordu do datasetu.

2. Pobiera ID rekordu i wysyła zapytanie do bazy czy istnieje jakiś taki rekord który ma takie samą wartość gdzieś jak pierwsze pole rekordu pobranego , potem sprawdza drugie pole itd. Jeśli wszystkie są TRUE to wyświetla

Niestety te dwie metody też nie są najszybsze.

Ten post edytował alek12 16.01.2013, 14:19:20
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 00:21