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:
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:
<?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?

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

 
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ć:
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?:
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:
<?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

Ostatnio komentowane

  1. ShoutBox Podświadomość
  2. ShoutBox Trilux
  3. ShoutBox morelowy-dolomit
  4. ShoutBox Lucidoremi
  5. ShoutBox Goran Lezczek
  6. ShoutBox Ktos
  7. Opcje dwuwartościowe... gosc

Skrypty użytkowników

  1. Klasa obsługi szablo... Lirdoner
  2. Sekcje user76
  3. Klasa walidująca for... user76
  4. Licznik Gości online korey
  5. Form Builder Comandeer
  6. Dynamiczny licznik z... korey
  7. Captcha Comandeer