Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Problem z operatorem logicznym OR
JinLisek
post 1.08.2011, 16:08:29
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 1.08.2011
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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

Ten post edytował JinLisek 1.08.2011, 16:10:06
Go to the top of the page
+Quote Post
peter13135
post 1.08.2011, 16:22:36
Post #2





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


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


--------------------
:)
Go to the top of the page
+Quote Post
JinLisek
post 1.08.2011, 16:32:56
Post #3





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 1.08.2011
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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 :)
Go to the top of the page
+Quote Post
peter13135
post 1.08.2011, 16:40:38
Post #4





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

Ostrzeżenie: (0%)
-----


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ę


--------------------
:)
Go to the top of the page
+Quote Post
JinLisek
post 5.08.2011, 11:31:32
Post #5





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 1.08.2011
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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

Ten post edytował JinLisek 5.08.2011, 12:06:14
Go to the top of the page
+Quote Post
ano
post 5.08.2011, 13:48:19
Post #6





Grupa: Zarejestrowani
Postów: 435
Pomógł: 40
Dołączył: 16.02.2003
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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


--------------------
Linkedin | ...
Go to the top of the page
+Quote Post
JinLisek
post 6.08.2011, 12:50:20
Post #7





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 1.08.2011
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ł?
Go to the top of the page
+Quote Post
Fifi209
post 6.08.2011, 12:59:23
Post #8





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


A dlaczego nie możesz użyć union select? Tylko będziesz walił dwa zapytania....


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
JinLisek
post 11.08.2011, 09:21:43
Post #9





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 1.08.2011
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ć?
Go to the top of the page
+Quote Post
--kacper.chrapa--
post 11.08.2011, 11:11:30
Post #10





Goście







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



Go to the top of the page
+Quote Post
JinLisek
post 12.08.2011, 12:14:30
Post #11





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 1.08.2011
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
--kacper.chrapa--
post 12.08.2011, 23:32:37
Post #12





Goście







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
Go to the top of the page
+Quote Post
JinLisek
post 16.08.2011, 12:44:34
Post #13





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 1.08.2011
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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..
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 12:58