Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> SQLite3 odczyt z ogromnej ilości tabel.
xvidasd
post 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ść...
Go to the top of the page
+Quote Post
Pyton_000
post 5.01.2015, 19:56:50
Post #2





Grupa: Zarejestrowani
Postów: 7 809
Pomógł: 1373
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ń:
  1. $tables = array();
  2. foreach($tabs as $tab){
  3. $tables[] = "SELECT rating FROM {$tab} WHERE xxx";
  4. }
  5.  
  6. $sql = implode("\n UNION \n", $tables);
  7. // i tu wykonujesz wygenerowane zapytanie SQL
Go to the top of the page
+Quote Post
xvidasd
post 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...
Go to the top of the page
+Quote Post
Pyton_000
post 5.01.2015, 20:48:06
Post #4





Grupa: Zarejestrowani
Postów: 7 809
Pomógł: 1373
Dołączył: 26.10.2005

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


" zamiast '
Go to the top of the page
+Quote Post
xvidasd
post 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" oneeyedsmiley02.png
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 smile.gif
Go to the top of the page
+Quote Post
Pyton_000
post 6.01.2015, 12:53:28
Post #6





Grupa: Zarejestrowani
Postów: 7 809
Pomógł: 1373
Dołączył: 26.10.2005

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


Ty wykonujesz 1000 zapytań, a u mnie tylko 1 wink.gif
Go to the top of the page
+Quote Post
mmmmmmm
post 7.01.2015, 09:44:40
Post #7





Grupa: Zarejestrowani
Postów: 1 411
Pomógł: 308
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.
Go to the top of the page
+Quote Post
Pyton_000
post 7.01.2015, 10:20:50
Post #8





Grupa: Zarejestrowani
Postów: 7 809
Pomógł: 1373
Dołączył: 26.10.2005

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


Tego nie wiedziałem wink.gif 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.
Go to the top of the page
+Quote Post
xvidasd
post 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 smile.gif
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: 18.09.2019 - 02:29