Wyszukiwarka z wieloma kryteriami

0

Myślę, że wybrałem dobry dział, dlatego proszę nie zrażajcie się wprowadzeniem do problemu, które odbiega od samego zagadnienia baz danych.

Wykorzystuję na stronie szablon ClassPress. W uproszczeniu jest to szablon WordPress, który posiada m.in. wszystkie podstawowe funkcje pozwalające na uruchomienie strony z ogłoszeniami (dodawanie, edytowanie itd.).

ClassiPress (CP) wykorzystuje domyślne mechanizmy przechowywania treści dostępne w WP. Nowe ogłoszenie jest dodawane jako post, tytuł ogłoszenia to tytuł postu a jego treść jest po prostu treścią postu WP. Oprócz tego, każde ogłoszenie może posiadać swoje szczególne cechy (cena towaru w ogłoszeniu, miasto gdzie można towar odebrac itd.). CP pozwala na dynamiczne definiowanie takich pól a ich wartości przechowywane są w tablicy wp_postmeta. Również jest to domyślny mechanizm WP a programiście dostarczany jest zestaw funkcji, które pozwalają w wygodny sposób korzystać z tej funkcji.

Tak więc dane o tym, ile kosztuje towar, z jakiego jest miasta i cała pozostała lista cech przechowywana jest w tabeli wp_postmeta. Jej struktura wygląda tak:

meta_id | post_id | meta_key | meta_value

przykład

1 | 1 | cp_city | Warszawa
2 | 1 | cp_price | 100

3 | 2 | cp_city | Kraków
3 | 2 | cp_price | 200

itd.

Moim zadaniem jest zbudowanie wyszukiwarki, która pozowli na wyszukiwanie ogłoszeń spełniających określone kryteria, czyli np. wszystkie ogłoszenia z Warszawy gdzie cena jest mniejsza niż 200 PLN.

Pierwsza myśl, jaka przychodzi to zbudowanie takiego zapytania

SELECT post_id FROM wp_postmeta WHERE  (meta_key = 'cp_city' AND meta_value = 'Warszawa')  AND (meta_key = 'cp_price' AND meta_value < 200)

niestety coś takiego nie zadziała.

Mam nadzieję, że dobrze przedstawiłem problem. Proszę o informacje jak rozwiązać ten problem.

0
SELECT post_id FROM wp_postmeta WHERE  (meta_key = 'cp_city' AND meta_value = 'Warszawa')  AND (meta_key = 'cp_price' AND meta_value < 200) group by post_id having count(*) = 2
0

@abrakadaber niestety nie działa to jak trzeba. Dostałem już odpowiedź na innym "forum", zaproponowano rozwiązanie z wykorzystaniem SELECT ... WHERE EXISTS (SELECT...) AND (SELECT...)

1
  1. nie działa to nie jest odpowiedź - i zapewniam Cię, że takie rozwiązanie działa
  2. a jak będziesz miał 10 warunków to napiszesz 10 podzapytań?
0

Nie działa, bo macie złe warunki w zapytaniu... Na logikę biorę;

SELECT distinct post_id FROM wp_postmeta WHERE  (meta_key = 'cp_city' AND meta_value = 'Warszawa') or (meta_key = 'cp_price' AND meta_value < 200)

1 użytkowników online, w tym zalogowanych: 0, gości: 1