Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP][MySQL]Pobieranie rekordów według określonych kryteriów
ossUter
post
Post #1





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 27.11.2013

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


Witam,

parę ładnych godzin borykam się z problemem, bardziej chodzi o kwestię SQL.

Obrazując, skrypt po wpisaniu w textboxa wyszukuje w SQL dane rekordy, gdzie nazwa = wpisanna_wartosc. Zakładając, że wpisałem 2 nazwy oddzielając je przecinkiem (X, Y)

Mianowicie 2 warunki:

a) jeśli się wybierze opcję "wszystkie zawierające wpisane wartości" ma szukać wszystkich rekordów, w których występuje dana wyżej "nazwa". To działa:
  1. $where .= "AND nazwa IN('" . implode("','", $wprowadzona_wartosc) . "')";


Wzór:

Zawiera X;
Zawiera Y;
Zawiera Y i X;

To działa jak należy.

b ) jeśli się wybierze opcję "wszystkie zawierające TYLKO wprowadzone wartości ma szukać rekordów, w których występuje tylko w "nazwa" to, co wprowadziliśmy.

Tutaj nie wiem, jak to zrobić.

Wzór:

Zawiera X i Y - tylko, nie chcę rekordów, które zawierają tylko X, tylko Y oraz ewentualnie jeśli w MySQL w "nazwa" jest 3 opcje (X, Y, Z).

Nie wiem jak to jaśniej wytłumaczyć, reausumując:



--------------------

Przykład:

Mam 5 wartości w tabeli, gdzie nazwa to w różnych kombinacjach:

1)Nazwa1, Nazwa2,
2)Nazwa1, Nazwa8,
3)Nazwa1, Nazwa9,
4)Nazwa8, Nazwa3,
5)Nazwa4, Nazwa5,


Używając wybranej opcji pierwszej, gdzie w polu textboxa wpisane będzie: "Nazwa1, Nazwa8" Wynikiem będzie:
1), 2),3),4), to jest prawidłowe.

Używając opcji drugiej efektem powinno być TYLKO 2).

Ten post edytował ossUter 27.01.2018, 19:57:28
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
trzczy
post
Post #2





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

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


Ale ty nie wiesz jakie zapytanie powinno pójść do bazy danych, czy jak takie zapytanie ułożyć ze zmiennych, które są w php?
Go to the top of the page
+Quote Post
ossUter
post
Post #3





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 27.11.2013

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


Nie mogę skonstruować zapytania. Uwzględniając opcje a, to proste, jeśli chodzi o b, to ręce mi opadły.

Wiem, że jest to niezrozumiałe, może inaczej.


Chcę pobrać rekordy uwzględnione w textboxie, tj:


  1. $where = "AND nazwa IN('" . implode("','", $wprowadzona_wartosc) . "')";


To pokazuje mi rekordy, gdzie nazwa należy do zbioru $wprowadzona wartość i zakładając, że wprowadziłem tam "wynik1, wynik2" pokażą mi się rekordy zawierające:
wynik1 LUB wynik2 LUB wynik1 i wynik2

Teraz potrzebuję jakoś dojść do rozwiązania, gdy wpiszę w textboxie "wynik1, wynik2" rezultatem będzie:
tylko rekordy zawierające wynik1 i wynik2, no i NIC PO ZA TYM.

Może teraz trochę rozjaśniłem problem.
Go to the top of the page
+Quote Post
trzczy
post
Post #4





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

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


Zapytanie to coś co z grubsza wygląda tak "SELECT blabla WHERE bla bla".

Z tego co widać, opcaowujesz kod php, który będzie takie zapytanie generował. Powinieneś tu na forum pokazać, jakie zapytanie kod generuje, a jakie powinien generować. Czyli zastosować var_dump albo echo
Go to the top of the page
+Quote Post
ossUter
post
Post #5





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 27.11.2013

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


Nie wiem o co chodzi, ale jak obserwuję te fora, to większość osób przychodzących z prośbą o pomoc, zostaje traktowana jak debile, nieważne.

Zapytanie się generuje prawidłowo, już sprawdziłem to wcześniej, dane z formularza są przekazywane. Moim problemem jest nieumiejętność, brak realnej wizji tego zapytania, po prostu nie potrafię go skonstruować. Operator IN() działa na zasadzie: IN('wartość', 'wartosc2', 'wartosc3'), czyli zapytanie będzie prawidłowe, jeśli znajdzie wartość lub wartosc2 lub wartosc i wartosc2 i wartosc3. Ja potrzebuję skonstruować zapytanie... a może bardziej warunek, w którym nie będzie spełniony jeśli będzie tylko wartosc, wartosc2 i wartosc3. Chciałbym, aby rekordy dla których warunek nie będzie spełniony, tj. będą pojedyncze wartosci nie będą uwzględniane, lecz całość - nie wykonywał się.

Kombinowałem też coś na zasadzie
  1. WHERE nazwa = 'przekazanawartosc1' AND nazwa = 'przekazanawartosc2' AND nazwa = 'przekazanawartosc3' AND nazwa = 'przekazanawartosc4'
, raz że nie pokazuje rekordów, warunek się nie spełnia. Używając operatora OR (lub) też nie spełnia moich oczekiwań, bo to szuka w tabeli jeśli jest przynajmniej 1 wartość znaleziona, to pokazuje, a moim celem jest jeśli wszystkie na raz wartości zostaną znalezione.

Go to the top of the page
+Quote Post
viking
post
Post #6





Grupa: Zarejestrowani
Postów: 6 381
Pomógł: 1116
Dołączył: 30.08.2006

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


Czyli jak słusznie zauważyłeś potrzebujesz operatora and dla wszystkich wartości. Możesz to zrobić tak jak robisz albo iteratorami spl.
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
Nie wiem o co chodzi, ale jak obserwuję te fora, to większość osób przychodzących z prośbą o pomoc, zostaje traktowana jak debile,
Poprostu osoba, "ktora traktuje cie jak debila" sama nie ogarnia problemu. Ot i zagadka rozwiazana

Cytat
WHERE nazwa = 'przekazanawartosc1' AND nazwa = 'przekazanawartosc2' AND nazwa = 'przekazanawartosc3' AND nazwa = 'przekazanawartosc4'

[PHP] pobierz, plaintext

, raz że nie pokazuje rekordów, warunek się nie spełnia.

A niby jakim cudem nazwa ma byc jednoczesnie rowna jednej wartosci i innej wartosci... Toz logiczne ze to NIGDY nie bedzie prawdziwe.

Pokaz DOKLADNIE jak wyglada struktura bazy oraz DOKLADNIE jak wygladaja wartosci. Bo narazie widzialem tylko psedu schemat z pseudo wartosciami
Go to the top of the page
+Quote Post
ossUter
post
Post #8





Grupa: Zarejestrowani
Postów: 47
Pomógł: 0
Dołączył: 27.11.2013

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


Tutaj efekt, jaki chciałbym osiągnąć: przejdz

Tylko na chwilę obecną nie mogę używać FULL-TEXT ze względu na chociażby ograniczenia znakowe, jak i wersję MySQL.

Nasuwa się pytanie - jak osiągnąć identyczny efekt, nie używając obecnej formy - FULL-TEXT? Po prostu chciałbym znaleźć jakąś inną alternatywę tego zapisu.

Ten post edytował ossUter 29.01.2018, 21:15:40
Go to the top of the page
+Quote Post
nospor
post
Post #9





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Masz zla strukture bazy.
Nie mozesz w jednym polu trzymac wszystkich keywords dla danego topic. Kazdy keyword ma byc oddzielnym rekordem. Wowczas idzie normalnie operowac na takiej strukturze

ps: oczywiscie tak jak teraz masz to mozna sie bawic tez, np tak:

WHERE nazwa like '%przekazanawartosc1%' AND nazwa like '%przekazanawartosc2%' AND nazwa like '%przekazanawartosc3%' AND nazwa like '%przekazanawartosc4%'

ale jest to malo eleganckie i pewnie srednio optymalne rozwiazanie
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 25.08.2025 - 06:26