Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z operatorem logicznym OR
Forum PHP.pl > Forum > Przedszkole
JinLisek
Witam. Jestem nowym użytkownikiem na tym forum. Tworzę nową stronę internetową i mam związany z tym problem. Chcę wyciągnąć z bazy danych, z różnych tabel informacje, jednak chcę to zrobić "jednocześnie". Tzn dokładnie chodzi mi o to, że chcę wyciągnąć informacje o obrazkach i filmikach, a później wyświetlić je, tak, żeby były pomieszane i posortowane (według daty dodania).

Wpadłem na pomysł, żeby użyć jednego while, jednak prawdopodobnie jeżeli pierwszy warunek jest spełniony to drugiego już nie sprawdza, a mi zależy na tym, żeby sprawdzał... Tu jest ta nieszczęsna pętla...

  1. $obrazki_query = mysql_query("SELECT * FROM `images` WHERE `nazwa` LIKE '%".$search."%';");
  2. $wideo_query = mysql_query("SELECT * FROM `movies` WHERE `nazwa` LIKE '%".$search."%';");
  3.  
  4. while( ( $obrazki = mysql_fetch_assoc($obrazki_query) ) || ( $wideo = mysql_fetch_assoc($wideo_query) ) )
  5. {
  6. echo '<a href="?id=obrazek&ido='.$obrazki['id_obrazka'].'">Obrazek</a><br />';
  7. echo '<a href="?id=wideo&idw='.$wideo['id_wideo'].'">Wideo</a><br />';
  8. }


Jeśli ktoś wie jak można mi pomóc to będę wdzięczny :)
peter13135
pomieszane i posortowane ? biggrin.gif albo jedno albo drugie.
  1. SELECT co_tylko_chcesz FROM tabela WHERE pole LIKE '%LALA%' ORDER BY date DESC

jak chcesz mieć date rosnąco to zamiast DESC daj ASC.

poza tym, da radę wszystko dać do jednego zapytania
JinLisek
Nie zrozumiałeś chyba :P

Ja chcę pobrać dane z dwóch różnych tabel, które nie są ze sobą w żaden sposób powiązane (jedna przechowuje dane o filmikach, druga o obrazkach). Myślałem, żeby to zrobić JOINEM, ale skoro nie są powiązane to nie wiedziałem czy da radę tak... Może postaram się lepiej wytłumaczyć o co mi chodzi.

1. Użytkownicy dodają filmiki i obrazki.
2. Użytkownik chce wyszukać obrazek albo filmik.
3. Moja wyszukiwarka ma jednocześnie szukać obrazków i filmików (które są w różnych tabelach w bazie danych).
4. Wyniki ma wyświetlać według daty dodania (najnowsze).
5. Problem polega na tym, że jeśli dam wypisywanie tych danych do różnych pętli while to nie wypisze mi np w ten sposób:
-obrazek;
-obrazek;
-filmik;
-obrazek;
-filmik;
-filmik;
(według tego, co jest najnowsze).

Z moimi umiejętnościami mogę najwyżej wyświetlić z jednej strony posortowane obrazki, z drugiej strony posortowane filmiki albo najpierw jedno, a pod spodem drugie... Jednak nie o to mi chodzi :p
Dlatego proszę o pomoc :)
peter13135
pobierz wszystko do tablicy (jednej), w taki sposob, żebyś potem potrafił odróżnić czy dany rekord jest obrazkiem czy filmikiem.
każdy rekord musi mieć pole data z takim samym formatem daty.
następnie posortuj tablicę
JinLisek
To muszę zrobić tablicę obiektów? Tzn jedno pole tablicy musi zawierać obiekt, który mówi czy jest to obrazek czy wideo, date dodania itp?

Edycja: aaa... Chodziło o nową tablicę w bazie danych? Zrozumiałem, że chodzi o tablicę jako zmienną (array), mój błąd... Spróbuję i napiszę jak mi poszło! Dzięki :)

Jednak nie będę próbował tego sposobu.. Jakoś mi się nie podoba przepisywanie rekordów z 2-3 tablic do jednej...
Jest może sposób, żeby w jednym zapytaniu pobrać rekordy z różnych, niepowiązanych ze sobą tablic?

Ok, moderator powiedział, że odświeżanie tematu to mniejsze zło niż tworzenie nowego, tak więc napiszę tu do czego doszedłem (sam).. :p

Otóż opracowałem taki o to dziwny warunek, dzięki któremu mogę wypisywać jednocześnie z dwóch różnych zapytań:

  1. while( ( ( $obrazki = mysql_fetch_assoc($obrazki_query) ) || ( $wideo = mysql_fetch_assoc($wideo_query) ) ) && ( ( ($obrazki['id_obrazka']) ? ( $wideo = mysql_fetch_assoc($wideo_query) ) : 1 ) ) )
  2. {
  3. //instrukcje
  4. }


Wydaje mi się, że działa to dobrze, jednak chciałbym znać wasze zdanie na ten temat, jako iż nie jestem profesjonalistą...

Jednak nie zawsze działa... Jeśli jest więcej wyników z tabeli $wideo niż z $obrazki to nie wyświetla wszystkich obrazków... Mimo, że według mnie powinno wyświetlać ponieważ po "&&" (AND) zwracam wartość 1 - true... Pomoże mi ktoś edytować ten warunek? Chodzi mi o to, żeby pętla póki może wypisywała z obu tabel, a później wypisywała z tej, z której nadal może (wiadomo, nie zawsze będzie tyle samo obrazków co filmików).
ano
Spróbuj w ten sposób:

  1. $obrazki_query = mysql_query("SELECT * FROM `images` WHERE `nazwa` LIKE '%".$search."%';");
  2. $wideo_query = mysql_query("SELECT * FROM `movies` WHERE `nazwa` LIKE '%".$search."%';");
  3.  
  4. while( ( $obrazki = mysql_fetch_assoc($obrazki_query) ) || ( $wideo = mysql_fetch_assoc($wideo_query) ) )
  5. {
  6. if($obrazki) echo '<a href="?id=obrazek&ido='.$obrazki['id_obrazka'].'">Obrazek</a><br />';
  7. if($wideo) echo '<a href="?id=wideo&idw='.$wideo['id_wideo'].'">Wideo</a><br />';
  8. }


Ale myślę, że sposób z tablicą i tak będzie najlepszy w twoim przypadku. (tablica w sensie ARRAY, nie tworzenie nowej tabeli w DB ;D)

  1. $obrazki_query = mysql_query("SELECT * FROM `images` WHERE `nazwa` LIKE '%".$search."%';");
  2. $wideo_query = mysql_query("SELECT * FROM `movies` WHERE `nazwa` LIKE '%".$search."%';");
  3.  
  4. $tablica = array();
  5. $i = 0;
  6.  
  7. //najpierw dodamy obrazki do $tablica
  8. while($obrazki = mysql_fetch_assoc($obrazki_query) )
  9. {
  10. $tablica[$i][0] = 'obrazek'; //oczywiscie musimy zapisac w tym momencie czy jest to obrazek czy wideo
  11. $tablica[$i++][1] = $obrazki['id_obrazka'];
  12. }
  13.  
  14. //teraz dodajemy wideo do naszej array
  15. while($wideo = mysql_fetch_assoc($wideo_query) )
  16. {
  17. $tablica[$i][0] = 'wideo';
  18. $tablica[$i++][1] = $wideo['id_wideo'];
  19. }
  20.  
  21. shuffle($tablica) //i mozesz sobie np pomieszac -- i to jest ten kluczowy pozytywny element w tym sposobie.
  22.  
  23. //a teraz wyświetlimy
  24.  
  25. for($i = 0; $i< count($tablica); ++$i) {
  26. if($tablica[$i][0]=='obrazek') {
  27. echo '<a href="?id=obrazek&ido='.$tablica[$i][1].'">Obrazek</a><br />';
  28. }
  29. else {
  30. echo '<a href="?id=wideo&ido='.$tablica[$i][1].'">Wideo</a><br />';
  31. }
  32. }
JinLisek
Wielkie dzięki za pomoc :)

Mam jeszcze jedno pytanie.. Chciałbym wiedzieć jak taką tablicę posortować, żeby wyświetlała rekordy od najnowszego...
Mam kolumnę "data_dodania", ale jest ona w takiej postaci: Y.m.d H:i, więc nie da rady chyba posortować według niej... Mógłbym też sortować według id, ale obrazki i wideo mają osobno liczone id, więc nie sortowałoby dokładnie... Macie pomysł?
Fifi209
A dlaczego nie możesz użyć union select? Tylko będziesz walił dwa zapytania....
JinLisek
Cytat(Fifi209 @ 6.08.2011, 13:59:23 ) *
A dlaczego nie możesz użyć union select? Tylko będziesz walił dwa zapytania....


Poczytałem trochę o union i to chyba rzeczywiście najlepsze rozwiązanie dla mnie... Tylko znowu jest problem z posortowaniem... Jeżeli posortuję te tabele w tym zapytaniu z union to one i tak będą posortowane osobno...

Dam przykład:

  1. SELECT * FROM `images` ORDER BY `data_dodania` DESC UNION SELECT * FROM `movies` ORDER BY `data_dodania` DESC


W takim razie gdybym miał tabele np tak ułożone:

images:
nazwa | data dodania

obrazek1 | 2011
obrazek2 | 2009
obrazek3 | 2011

movies:
nazwa | data dodania

filmik1 | 2001
filmik2 | 2010

To i tak wypisałoby mi w tej kolejności:
obrazek1, obrazek3, obrazek2, filmik2, filmik1...

A chodzi mi o to, żeby wypisało np. w takiej kolejności:
obrazek1, obrazek3, filmik2, obrazek2, filmik1

Odświeżam po raz kolejny... Nadal nie wiem w jaki sposób posortować te dane... Próbuję na bardzo różne (często dziwne) sposoby, ale nic nie pomaga... Naprawdę nikt nie wie jak to zrobić?
-kacper.chrapa-
Witam :-)

1. Zrob widok :

CREATE VIEW filmiki_i_obrazki AS SELECT * FROM `images` UNION SELECT * FROM `movies`



2. I teraz z poziomu PHP mozesz po prostu :


SELECT * FROM filmiki_i_obrazki ORDER BY data_dodania ASC


I po sprawie - sortujesz jak chcesz caly zsumowany zestaw danych - no i w PHP bardziej elegancki kod, bo odwołujesz sie do jednego widoku zamiast 2 tabel. Oczywiscie,
jesli chodzi o odczyt to widok traktujesz jak zwykla tabelke - where, limit, itd dziala jak przy zwyklej.

Pozdrawiam,
Kacper Chrapa
http://www.edusequence.com/informacje/szkolenia



JinLisek
Wielkie dzięki! Teraz działa jak należy :) Chociaż musiałem w tabeli `movies` dodać 2 kolumny, ponieważ tabele różniły się liczbą kolumn, a teraz id_wideo jest przechowywane w "id_obrazka" etc, ale wiem jak je rozróżnić, więc jest dobrze xp
-kacper.chrapa-
Hmm.. kolumn nie trzeba dodawac ;-)

wystarczy

create view filmy_i_obrazki as
select id_obrazka,obrazek,kolumna_jakas from obrazki
union
select id_filmu,film,kolumna_jakas from filmy


Chodzi o to aby WYBRANA ilosc kolumn z obu tabel sie zgadzala (oraz odpowiednie typy danych).

Generalnie, problem ten pojawia sie na poziomie unii, a nie widoku - dziwne, z postow wynikalo (w kazdym razie na pierwszy rzut oka), ze union juz Ci dziala - czyli ze miales struktury tabel analogiczne do siebie...

W kazdym razie, latwiej dobrac kolumny na tym poziomie ;-)


Pozdrawiam,
Kacper Chrapa
http://www.edusequence.com/informacje/szkolenia
JinLisek
Tak.. Wcześniej mi się zgadzało, bo nie miałem jeszcze dwóch kolumn, a teraz do jednej tabeli dodałem i dlatego nie chciało działać... Ale dodałem też do drugiej, z wartościami null i teraz rozróżniam w ten sposób z której tabeli pochodzi rekord..
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.