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
$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'
);
if(isset($_GET['dzial']) && in_array($_GET['dzial'], $gatunki)){
$dzial = $_GET['dzial'];
echo $dzial; $keys = array_keys($gatunki, $dzial); $keys = implode(" ", $keys);
echo $keys.'<br />'; $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="";while($wiersz = mysql_fetch_array($sql_kategorie_odp)){
$where[]= "id='".$wiersz['id_movie']."' "; }
if($where){
$where = implode("OR ",$where); }else{ echo 'Brak Filmów Tej Kategorii';
include ('../layout/footer.php');
exit;
}
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];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();
}
$sql = 'SELECT * FROM `movies` WHERE '.$where.' ORDER BY `id` DESC limit '.$start.','.($end - $start + 1); 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;?>
</div>
<?php
while($wiersz = mysql_fetch_array($odp)){ extract($wiersz);
}
?>
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
$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'
);
if(isset($_GET['dzial']) && in_array($_GET['dzial'], $gatunki)){
$dzial = $_GET['dzial'];
$keys = array_keys($gatunki, $dzial); $keys = implode(" ", $keys);
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];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();
}
$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;?>
</div>
<?php
while($wiersz = mysql_fetch_array($odp)){ extract($wiersz);
}
Odpowiedz