Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ SQLite _ SQLite3 odczyt z ogromnej ilości tabel.

Napisany przez: xvidasd 5.01.2015, 19:16:36

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ść...

Napisany przez: Pyton_000 5.01.2015, 19:56:50

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 = http://www.php.net/array();
  2. foreach($tabs as $tab){
  3. $tables[] = "SELECT rating FROM {$tab} WHERE xxx";
  4. }
  5.  
  6. $sql = http://www.php.net/implode("\n UNION \n", $tables);
  7. // i tu wykonujesz wygenerowane zapytanie SQL

Napisany przez: xvidasd 5.01.2015, 20:47:04

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...

Napisany przez: Pyton_000 5.01.2015, 20:48:06

" zamiast '

Napisany przez: xvidasd 6.01.2015, 09:49:21

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

Napisany przez: Pyton_000 6.01.2015, 12:53:28

Ty wykonujesz 1000 zapytań, a u mnie tylko 1 wink.gif

Napisany przez: mmmmmmm 7.01.2015, 09:44:40

Tylko, że jego zapytania się wykonają. Twoje niekoniecznie.
SQLite ma limit 500 SELECTów w jednym zapytaniu.

Napisany przez: Pyton_000 7.01.2015, 10:20:50

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.

Napisany przez: xvidasd 13.01.2015, 19:46:40

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)