Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL]Pobieranie rekordów według określonych kryteriów
Forum PHP.pl > Forum > Przedszkole
ossUter
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).
trzczy
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?
ossUter
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.
trzczy
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
ossUter
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.

viking
Czyli jak słusznie zauważyłeś potrzebujesz operatora and dla wszystkich wartości. Możesz to zrobić tak jak robisz albo iteratorami spl.
nospor
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
ossUter
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.
nospor
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
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.