SQLite3 odczyt z ogromnej ilości tabel. |
SQLite3 odczyt z ogromnej ilości tabel. |
5.01.2015, 19:16:36
Post
#1
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 5.01.2015 Ostrzeżenie: (0%) |
Witam.
Od kilku dni próbuje rozgryźć SQLite3 i wertuję net w poszukiwaniu rozwiązania i nic sensownego nie znajduję. Dlatego postanowiłem, poprosić Was, czyli specjalistów o pomoc. Mam bazę, w której jest blisko tysiąc tabel. W każdej z nich są po trzy kolumny (id, rating,ip) - są więc takie same (znajdują się w nich tylko różne dane). Chciałbym odczytać i porównać dane ze wszystkich na raz (rekord rating gdzie ip=1). Nie da się więc przy pomocy UNION bo niby jak? Mam tysiąc razy to powtórzyć? Nie da się też zastosować zmiennej po FROM więc jak? Najlepiej by było tak: - najpierw pobieram nazwy tabel (name) i od razu pobieram dane z tabel z pola "rating" (gdzie id jest równe 1) : Kod <?php try { $db = new PDO('sqlite:./rating/database/ratings2.sqlite'); } catch (PDOException $e) { print "Błąd połączenia z bazą!: " . $e->getMessage() . "<br/>"; die(); } $statement = $db->query('SELECT name FROM sqlite_master UNION SELECT rating FROM name WHERE id="1" '); foreach($statement as $wiersz) { echo(" = ".$wiersz['name']."<br />"); echo(" = ".$wiersz['rating']."<br />"); } $statement->closeCursor(); ?> Ale to oczywiście nie może działać... Może więc podmieniać nazwy tabel pod $zmienna i w ten sposób odczytywać pola rating ze wszystkich tabel? Kod $statement = $db->query('SELECT name FROM sqlite_master UNION SELECT rating FROM $zmienna WHERE id="1" '); foreach($statement as $wiersz) { echo(" = ".$wiersz['name']."<br />"); echo(" = ".$wiersz['rating']."<br />"); $zmienna = $wiersz['name']; } Bez szans... - też nie zadziała... Czy ktoś ma jakiś pomysł? Nie wiem w którym kierunku iść... |
|
|
5.01.2015, 19:56:50
Post
#2
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
Pomysł? Zmienić strukturę bazy bo masz spiep... na maksa.
Jeżeli już jednak nie możesz to: - pobierasz nazwy tabel - w pętli foreach dodajesz sobie coś w deseń:
|
|
|
5.01.2015, 20:47:04
Post
#3
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 5.01.2015 Ostrzeżenie: (0%) |
Bardzo dziękuję za odpowiedz.
Bazy nie mogę zmienić (a przynajmniej na razie). Rozumiem o co Ci chodzi i faktycznie tak spróbuję - mam tylko jeden problem z podstawami SQLite3 (a w necie ciężko o podpowiedź). Z SQLite3 dotychczas nie miałem styczności i nie rozumiem, dlaczego niektóre funkcje po prostu nie działają choć powinny. Dlaczego np. to zadziała (alice to nazwa tabeli) Kod $statement = $db->query('SELECT rating FROM alice '); foreach($statement as $wiersz) { echo(" = ".$wiersz['rating']."<br />"); } a to już nie? Kod $i="alice"; $statement = $db->query('SELECT rating FROM {$i} '); foreach($statement as $wiersz) { echo(" = ".$wiersz['rating']."<br />");} Gdy po FROM dodam zmienną to dostaję biały ekran... |
|
|
5.01.2015, 20:48:06
Post
#4
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
" zamiast '
|
|
|
6.01.2015, 09:49:21
Post
#5
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 5.01.2015 Ostrzeżenie: (0%) |
Jezuuu "czeski błąd"
Wiedziałem, że utknąłem na jakiejś bzdecie. Dziękuję - zabieram się za testy. Zrobiłem troszkę inaczej i działa! Kod <?php try { $db = new PDO('sqlite:./rating/database/ratings2.sqlite'); } catch (PDOException $e) { print "Błąd połączenia z bazą!: " . $e->getMessage() . "<br/>"; die(); } $tables = array(); $tabless = array(); $statement = $db->query("SELECT name FROM sqlite_master"); foreach($statement as $wiersz) { $i = $wiersz['name']; $statementt = $db->query("SELECT rating FROM {$i} WHERE id='1' "); foreach($statementt as $wierszz) { $tables[] = $wiersz["name"]; $tabless[] = $wierszz["rating"]; } } $statement->closeCursor(); arsort($tabless); foreach ($tabless as $klucz => $wartosc) { echo $tables[$klucz]; echo $wartosc."<br />"; } ?> Zamiast UNION najpierw odczytuję nazwy tabel a potem w pętli odczytuję dane z tabel. Dziękuję za natchnienie i pomoc |
|
|
6.01.2015, 12:53:28
Post
#6
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
Ty wykonujesz 1000 zapytań, a u mnie tylko 1
|
|
|
7.01.2015, 09:44:40
Post
#7
|
|
Grupa: Zarejestrowani Postów: 1 421 Pomógł: 310 Dołączył: 18.04.2012 Ostrzeżenie: (0%) |
Tylko, że jego zapytania się wykonają. Twoje niekoniecznie.
SQLite ma limit 500 SELECTów w jednym zapytaniu. |
|
|
7.01.2015, 10:20:50
Post
#8
|
|
Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) |
Tego nie wiedziałem Ale człowiek uczy się całe życie.
Poza tym nic nie stoi na przeszkodzie żeby porozbijać te zapytanie po np. 200 czy tam 100 i tyle. |
|
|
13.01.2015, 19:46:40
Post
#9
|
|
Grupa: Zarejestrowani Postów: 4 Pomógł: 0 Dołączył: 5.01.2015 Ostrzeżenie: (0%) |
Skrypcik działa i śmiga pięknie - myślałem, że będzie zamulał itp ale jest ok.
Chodziło o ustawienie w rosnącej kolejności tych stu pozycji (z 1140) wg. oceny użytkowników (ilości gwiazdek). http://seriale-asd.pl/ranking_najlepszy_serial.php Dzięki jeszcze raz za pomoc i natchnienie |
|
|
Wersja Lo-Fi | Aktualny czas: 25.09.2024 - 09:01 |