• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Złożone zapytanie w MySQL

Object Storage Arubacloud
0 głosów
1,464 wizyt
pytanie zadane 16 stycznia 2018 w SQL, bazy danych przez Adam Ostrogórski Obywatel (1,070 p.)

Witam,

w bazie danych mam tabelę post_meta,  a w niej kolumny: post_id, meta_key, meta_value. Każdy post ma kilka meta_key, które mają swoje wartości meta_value.
Próbuję napisać zapytanie, które wybrałoby z bazy ten post_id, dla którego:

meta_key: klucz1 ma wartość: meta_value: wartosc1 oraz

meta_key: klucz2 ma wartość: meta_value: wartosc2 oraz

meta_key: klucz3 ma wartość: meta_value>=1

Napisałem takie zapytanie:

SELECT post_id FROM post_meta WHERE (meta_key='klucz1' AND meta_value='wartosc1') AND (meta_key='klucz2' AND meta_value='wartosc2') AND (meta_key='klucz3' AND meta_value>=1)

W jaki sposób można by napisać to zapytanie?
 

2 odpowiedzi

+1 głos
odpowiedź 16 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
wybrane 16 stycznia 2018 przez Adam Ostrogórski
 
Najlepsza
edit: musiałbyś INTERSECT użyć i rozdzielić to jedno zapytanie na 3 części i wtedy zadziała
komentarz 16 stycznia 2018 przez Adam Ostrogórski Obywatel (1,070 p.)

Dziękuję za cenną podpowiedź.

Spróbowałem w ten sposób:


SELECT post_id FROM post_meta WHERE (meta_key='klucz1' AND meta_value='wartosc1') 
UNION
SELECT post_id FROM post_meta WHERE (meta_key='klucz2' AND meta_value='wartosc2') 
UNION
SELECT post_id FROM post_meta WHERE  (meta_key='klucz3' AND meta_value>=1)

Tym sposobem dalej wyświetla wszystkie post_id, które spełniają choć 1 warunek, a nie wszystkie trzy naraz. Czy wiesz, gdzie robię błąd?

komentarz 16 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
Chyba na początku nie zrozumiałem co chcesz zrobić. W każdym razie skoro napisałeś, że jeden post może mieć kilka meta_key to zakładam, że w Twojej tabeli post_id się powtarza. Jeśli tak jest to powinieneś mieć jeszcze jakąś kolumnę która jest kluczem głównym. No ale pomijając ten fakt, to potrzebujesz czegoś co Ci zbierze wyniki z tych 3 zapytań i znajdzie część wspólną (iloczyn zbiorów) czyli INTERSECT zamiast UNION.
komentarz 16 stycznia 2018 przez Adam Ostrogórski Obywatel (1,070 p.)
Wielkie dzięki. Faktycznie. A znasz może alternatywę dla INTERSECT w przypadku, gdy MySQL go nie obsługuje?
komentarz 16 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
Wydaje mi się, że, powinno pomóc jak zrobisz dwa razy INNER JOIN z tą samą tabelą łącząc po post_id (powinieneś mieć sklejone 3 tabele) i np. nadajesz im aliasy pm1, pm2, pm3. Następnie piszesz jeden duży WHERE w którym sprawdzasz czy pm1.meta_key = 'klucz1' AND pm1.meta_value='wartosc1' AND pm2.meta_key='klucz2' itd. no i jak chesz potem bez duplikatów to distinct na tej kolumnie post_id.
komentarz 16 stycznia 2018 przez Adam Ostrogórski Obywatel (1,070 p.)
edycja 16 stycznia 2018 przez Adam Ostrogórski

Czy tak powinno mi wyjść:

SELECT *
FROM post_meta as pm1 
INNER JOIN post_meta as pm2 ON pm1.post_id = pm2.post_id
INNER JOIN post_meta as pm3 ON pm2.post_id = pm3.post_id
WHERE
pm1.meta_key = 'klucz1' AND pm1.meta_value='wartosc1'
AND
pm2.meta_key = 'klucz2' AND pm2.meta_value='wartosc2'
AND
pm3.meta_key = 'klucz3' AND pm3.meta_value='wartosc3'

 

komentarz 16 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
o coś takiego mi chodziło, ale na danych jakichś sprawdź czy dobre wyniki dostajesz
komentarz 16 stycznia 2018 przez Adam Ostrogórski Obywatel (1,070 p.)
Właśnie sprawdziłem i wszystko działa! Bardzo Ci dziękuję za pomoc i naukę.
komentarz 16 stycznia 2018 przez Tomasz90 Nałogowiec (25,140 p.)
Nie ma problemu
0 głosów
odpowiedź 16 stycznia 2018 przez Patryk Kirszenstein Bywalec (2,400 p.)
SELECT post_id FROM post_meta WHERE (meta_key='klucz1' AND meta_value='wartosc1') or (meta_key='klucz2' AND meta_value='wartosc2') or (meta_key='klucz3' AND meta_value>=1) bo wyklucza się jeżeli podasz że key ma być róny 1 i dwa
komentarz 16 stycznia 2018 przez Adam Ostrogórski Obywatel (1,070 p.)

Rozumiem, tylko właśnie chodzi mi o to, że jeden post w post_meta ma kilka różnych meta_key i chciałbym zrobić zapytanie, w którym trzy konkretne meta_key mają określoną wartość.

meta_key: klucz1 ma wartość: meta_value: wartosc1

meta_key: klucz2 ma wartość: meta_value: wartosc2

meta_key: klucz3 ma wartość: meta_value>=1

Gdy zrobię zapytanie z OR, wtedy wyświetli mi posty, dla których będzie spełniony tylko jeden warunek z jednym kluczem, a reszta kluczy bez warunku.

Czy da się zrobić takie zapytanie? Albo widzisz inne rozwiązanie?

Będę wdzięczny za każdą pomoc.

 

Podobne pytania

0 głosów
2 odpowiedzi 296 wizyt
pytanie zadane 21 października 2017 w SQL, bazy danych przez Krzysztofson Użytkownik (620 p.)
0 głosów
1 odpowiedź 356 wizyt
pytanie zadane 29 sierpnia 2017 w SQL, bazy danych przez MałyAleWariat Bywalec (2,830 p.)
0 głosów
1 odpowiedź 203 wizyt
pytanie zadane 11 października 2015 w SQL, bazy danych przez Dawid Warduliński Obywatel (1,830 p.)

92,551 zapytań

141,396 odpowiedzi

319,527 komentarzy

61,936 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...