Wyciąganie danych

2011-03-22 00:58:18 Post #1 korey

 
zrobiłem sobie tabele co pobiera takie pola:

movie_id | category

midie_id jest INT category varchar
w category pakuje w takiej postaci dane "3|11|6|43|1" << liczby nie powtarzają się
teraz wstęp problemu:

Nie wiem jak mam wykonać zapytanie by nie wybierało mi z bazy wszystkiego co ma w sobie liczbę 1 przykład:
Rekod1 -- "2|3|11|5|1"
Rekod2 -- "5|18|43|2"
Rekod3 -- "3|1|5"
Rekod4 -- "9|31|5|1"
w/w przykład ma właśnie tak działać
OPIS:
teraz przy wykonywaniu zapytania z użyciem LIKE czy też REGEXP nie traktuje mi argumentu jak trzeba, a wywala wszystko co ma w sobie 1
aktualnie wyczarowałem takie zapytanie:
1
2
3
SELECT movies.*, movies_category.category FROM `movies` INNER JOIN 
`movies_category` ON movies.id=movies_category.movie_id AND movies.active_movie='1' 
WHERE movies_category.category  REGEXP '$keys' ORDER BY movies.id DESC

$keys to moje magiczne 1

tak sprawić by sql traktowało mi 1 jako 1 a 11 jak 11?

2011-03-22 06:56:38 Post #2 nospor

 
Hmmm, czy to już przypadkiem z Tobą nie przerabiałem, że taka konstrukcja jest do 4 litert? Na wiązanie filmu z kategorią ma być oddzielna tabela - wówczas wszystko jest banalnie proste.

2011-03-22 13:26:49 Post #3 korey

 
No tale ale przy większej ilości filmów danej kategorii robi mi takie zapytania:

SELECT * FROM `movies` WHERE id='2' OR id='8' OR id='10' OR id='11' OR id='13' OR id='14' OR id='19' OR id='24' OR id='28' OR id='31' OR id='36' OR id='37' OR id='42' OR id='44' OR id='47' OR id='52' OR id='56' OR id='59' OR id='60' OR id='63' ORDER BY `id` DESC limit 0,10

tak nabazgrałem w php:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
<?php
// NO TO ZACZYNAMY
// gatunki słownie
$gatunki = array('Wrestling',
 
'Animowane''Dramatyczne''Fantasy''Sportowe''Historyczne''Komedie''Kryminalne''Muzyczne',
 
'Przygodowe''Romantyczne''Sensacyjne''Thrillery''Horrory''Wojenne''Seriale''Erotyczne',
 
'Akcji''Filmy Polskie''Dokumentalne''Inne''Obyczajowe''Anime i Manga''Familijne''Westerny',
 
'Kreskówki''Sci-Fi''Seriale Zagraniczne''Seriale Polskie''Speedway'
);
// Pobieram GET
// Przyjmijmy ze GET TO 'Horrory'
if(isset($_GET['dzial']) && in_array($_GET['dzial'], $gatunki)){
$dzial $_GET['dzial'];
echo 
$dzial// sprawdzam czy get przeslalo dział  -- tu jest np: Dramatyczne
$keys array_keys($gatunki$dzial); // pobieramy index mając zawartość
$keys implode(" "$keys);
echo 
$keys.'<br />'//klucz jaki zawiera $dział w tabliczy $gatunki

    // pobieram kategorie
    
$sql_kategorie "SELECT * FROM `category_movies` WHERE `id_category`='$keys'";
    echo 
$sql_kategorie.'<br /><br />';
    
mysql_query($sql_kategorie) or die('<br /><br />ZAPYTANIE: '.$sql.'BŁĄD: '.mysql_error());
    
$sql_kategorie_odp mysql_query($sql_kategorie);
    
$where="";// deklarujemy pusta zmienna
while($wiersz mysql_fetch_array($sql_kategorie_odp)){
    
$where[]= "id='".$wiersz['id_movie']."' "//przygotowujemy warunki zapytania
}
//    echo count($where); ile wierszy
/* # sprawdzamy sobie co zapiera tablica z warunkami
echo '<pre>';
print_r($where);
echo '</pre>';
*/    
if($where){
$where implode("OR ",$where); // twozymy warunek do bazy i uzywamy OR jako separatora
}else{ // Jeśli brak filmów danej kategorii oddajemy odpowiedni komunikat
echo 'Brak Filmów Tej Kategorii';
include (
'../layout/footer.php');
exit;
}
    


    
//Robimy pagera
require_once('../includes/class/Pager.class.php');
$sql 'SELECT count(*) FROM `movies` WHERE '.$where;
$result mysql_query($sql);
$row mysql_fetch_array($result);
$recordsCount $row[0];//pobranie liczby rekordów
try{
    
$pager = new Pager('pager_dzial'null);
    
$pager->SetTotalRecords($recordsCount);
    
$pager->Make(true);
    
$pag $pager->Render();
    
$start $pager->GetIndexRecordStart();
    
$end $pager->GetIndexRecordEnd();
}
catch (
Exception $e) {
    echo 
$e->getMessage();
}

//zapytanie z uwzglenieniem stronicowania
    
$sql 'SELECT * FROM `movies` WHERE '.$where.' ORDER BY `id` DESC limit '.$start.','.($end $start 1); // tu powstaje zapytanie które pokazałem wyżej
    
echo $sql;
    
mysql_query($sql) or die('<br /><br />ZAPYTANIE: '.$sql.'BŁĄD: '.mysql_error());
    
$odp mysql_query($sql);
?>    
<div id="pagers">
<?php
echo $pag;//wyswietlenie pager'a
?>
</div>
<?php    
while($wiersz mysql_fetch_array($odp)){ // pobieram wszystkie filmy z bazy
    
extract($wiersz);
/*
.
.
.
filmy

*/
}
?>

2011-03-22 13:55:44 Post #4 nospor

 
Ale po co ci taki "potworek"? Wyjaśnij mi proszę, bo na chwilę obecną nie widzę w tym żadnego sensu.

2011-03-22 14:03:47 Post #5 korey

 
Mam Ci wyjaśnić jak to działa.?

2011-03-22 14:05:15 Post #6 nospor

 
Tak, poproszę
Nie widzę sensu tworzenia takiego "potworka" składającego się z tylko ORow więc wyjaśnij mi proszę dlaczego go tworzysz. Wówczas ci pomogę...chyba

2011-03-22 14:15:27 Post #7 korey

 
No więc w/g moich założeń to miało działać tak:

1) Z tablicy gatunki pobieramy klucz na podstawie wartości $_GET['dzial']
2) teraz gdy mamy klucz robimy zapytanie które na podstawie wartości zmiennej $keys pobierze nam wszystkie ideki filmów które pasują kategorią do $keys.
3) pobrane filmy pasujące do kategorii maja różne ID np: 12, 8, 23, 31, 52, 17
4) dlatego ze mam różne id robię tablice która będzie jednym całym warunkiem do pobrania filmów.

Tak właśnie powstaje 'potworek'

2011-03-22 14:20:41 Post #8 nospor

 
No właśnie....
Nie wiesz o tym, że w select może być więcej niż jedna tabela?

1
2
3
4
select m.* from movies m
left join category_movies cm on cm.id_movie=m.id
where cm.id_category=4

I popatrz, "potworki" zniknęły

2011-03-22 14:23:52 Post #9 korey

 
Kurcze zapytanie jest ok ale ja go nie rozumiem.. co znaczy m.* i cm?

2011-03-22 14:35:09 Post #10 nospor

 
Jest to alias (krótsza nazwa) odpowiednio dla tabeli movies oraz category_movies

2011-03-22 14:36:33 Post #11 korey

 
czyli jak bede mial np korey_tabela to alians bedzie kt a jak bedzie np mam_sobie_zapytanie to alians msz.?

2011-03-22 14:39:04 Post #12 nospor

 
Alias to ty określasz. Równie dobrze aliasem dla korey_tabela może być alias: durny_alias_dla_tabeli_korey_tabela.

Aliast określasz po nazwie tabeli. Jak go określisz to zależy tylko i wyłącznie od Ciebie.

2011-03-22 14:39:55 Post #13 nospor

 
1
2
3
4
select m.* from movies m 
left join category_movies cm on cm.id_movie=m.id 
where cm.id_category=4

Było tak. Ale równie dobrze może być:
1
2
3
4
select xyz.* from movies xyz 
left join category_movies cm on cm.id_movie=xyz.id 
where cm.id_category=4

2011-03-22 14:42:04 Post #14 korey

 
to moge to zapytanie wykonac tak?:
1
2
3
select movies.* from movies left join
 category_movies on category_movies.id_movie=movies.id
where category_movies.id_category=1
---------
Edit:

A juz rozumiem. aliasy pozwalają na krótszy zapis zapytania. tak?

2011-03-22 14:43:26 Post #15 nospor

 
Tak.
Ja używam aliasów by sobie po prostu skrócić zapis.

2011-03-22 14:45:42 Post #16 korey

 
Ok juz rozumiem Po raz kolejny mnie czegoś nauczyłeś.. Dzięki wielkie
PS dla sfinalizowania wątku 'potworka' zamieniłem na mniejszego potworka:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
<?php
// NO TO ZACZYNAMY
// gatunki słownie
$gatunki = array('Wrestling',
 
'Animowane''Dramatyczne''Fantasy''Sportowe''Historyczne''Komedie''Kryminalne''Muzyczne',
 
'Przygodowe''Romantyczne''Sensacyjne''Thrillery''Horrory''Wojenne''Seriale''Erotyczne',
 
'Akcji''Filmy Polskie''Dokumentalne''Inne''Obyczajowe''Anime i Manga''Familijne''Westerny',
 
'Kreskówki''Sci-Fi''Seriale Zagraniczne''Seriale Polskie''Speedway'
);
// Pobieram GET
// Przyjmijmy ze GET TO 'Horrory'
if(isset($_GET['dzial']) && in_array($_GET['dzial'], $gatunki)){
    
$dzial $_GET['dzial'];
    
$keys array_keys($gatunki$dzial); // pobieramy index mając zawartość
    
$keys implode(" "$keys);
    


    
//Robimy pagera
require_once('../includes/class/Pager.class.php');
$sql 'SELECT count(*) FROM movies m left join category_movies cm on cm.id_movie=m.id WHERE cm.id_category=1';
$result mysql_query($sql);
$row mysql_fetch_array($result);
$recordsCount $row[0];//pobranie liczby rekordów
try{
    
$pager = new Pager('pager_dzial'null);
    
$pager->SetTotalRecords($recordsCount);
    
$pager->Make(true);
    
$pag $pager->Render();
    
$start $pager->GetIndexRecordStart();
    
$end $pager->GetIndexRecordEnd();
}
catch (
Exception $e) {
    echo 
$e->getMessage();
}

//zapytanie z uwzglenieniem stronicowania
    
$sql 'SELECT m.* FROM movies m left join category_movies cm on cm.id_movie=m.id WHERE cm.id_category='.$keys.'  ORDER BY `id` DESC limit '.$start.','.($end $start 1);
    
mysql_query($sql) or die('<br /><br />ZAPYTANIE: '.$sql.polskie_znaki('BŁĄD: '.mysql_error()));
    
$odp mysql_query($sql);
?>    
<div id="pagers">
<?php
echo $pag;//wyswietlenie pager'a
?>
</div>
<?php    
while($wiersz mysql_fetch_array($odp)){ // pobieram wszystkie filmy z bazy
    
extract($wiersz);
/*
.
.
Filmy
*/
}

Odpowiedz