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

question-closed Jak pobrać dane przypisane do tagów?

Aruba Cloud - Virtual Private Server VPS
0 głosów
161 wizyt
pytanie zadane 19 grudnia 2018 w SQL, bazy danych przez Muhin Gaduła (4,120 p.)
zamknięte 20 grudnia 2018 przez Muhin

Cześć.

Mam taką tabelę:

id tag_id series_id
1 1 1
2 2 1
3 1 2
4 2 2
5 2 3
6 5

3

Jak widać mam tabelę z identyfikatorami tagów i jakichś serii. Każda seria może mieć kilka tagów więc dla jednej serii można mieć kilka wierszy z tagami. Chcę zrobić wyszukiwarkę treści na podstawie tych tagów. Załóżmy, że szukam wszystkich treści posiadających tag 1 i 2. Rezultatem takiego zapytania powinny być wiersze 1, 2, 3, 4. Jak skonstruować zapytanie które spełni moje oczekiwania?

komentarz zamknięcia: Problem rozwiązany.

2 odpowiedzi

0 głosów
odpowiedź 19 grudnia 2018 przez Anysiu68 Użytkownik (820 p.)

Witaj.

Po pierwsze aby dostać połączenie wszystkich kategorii i tagów użyj zapytania:

SELECT * FROM series, tags, serie_tag
WHERE series.id = serie_tag.id AND tags.id = serie_tag.tag_id

Następnie możesz do tego dodać warunek filtrujący wyniki np:

SELECT * FROM series, tags, serie_tag
WHERE series.id = serie_tag.id AND tags.id = serie_tag.tag_id
AND (serie_tag.tag_id = 1 OR serie_tag.tag_id = 2)

Później możesz wybierać konkretne kolumny, grupować wyniki, przekazać tablicę tagów zamiast sklejać je OR itd.

Niestety nie mam dostępu do żadnej bazy danych i piszę z pamięci, ale mam nadzieję, że nie popełniłem żadnego błędu.

W razie wątpliwości pytaj śmiało.

Pozdrawiam.

komentarz 19 grudnia 2018 przez Muhin Gaduła (4,120 p.)

Napisałem takie zapytanie:

SELECT serieses_tags.series_id FROM serieses_list, serieses_tags, tags 
WHERE serieses_list.id = serieses_tags.series_id AND tags.id = serieses_tags.tag_id 
AND (serieses_tags.tag_id = 1 OR serieses_tags.tag_id = 3)

ale w takim wypadku dostaję wszystkie pozycje w których jest tag o ID 1, a założenie jest takie żeby dawało wszystkie pozycje w których są tagi o ID 1 i 3 więc zmieniłem to zapytanie na takie:

SELECT serieses_tags.series_id FROM serieses_list, serieses_tags, tags 
WHERE serieses_list.id = serieses_tags.series_id AND tags.id = serieses_tags.tag_id 
AND (serieses_tags.tag_id = 1 AND serieses_tags.tag_id = 3)

i nie dostałem żadnego rezultatu, a powinno ich być co najmniej kilka.

0 głosów
odpowiedź 20 grudnia 2018 przez Muhin Gaduła (4,120 p.)

Dobra, udało mi się jakoś pokombinować i znalazłem rozwiązanie.

SELECT serieses_tags.series_id
FROM serieses_tags
JOIN tags
ON tags.id = serieses_tags.tag_id
GROUP BY serieses_tags.series_id
HAVING SUM(CASE WHEN tags.id = 1 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN tags.id = 3 THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN tags.id = 6 THEN 1 ELSE 0 END) > 0

 

Podobne pytania

0 głosów
1 odpowiedź 169 wizyt
pytanie zadane 9 maja 2019 w JavaScript przez Whereismycode Obywatel (1,710 p.)
0 głosów
1 odpowiedź 284 wizyt
pytanie zadane 20 stycznia 2017 w PHP przez DanielMK Nowicjusz (120 p.)
0 głosów
3 odpowiedzi 317 wizyt
pytanie zadane 11 lutego 2017 w PHP przez ThePatrykOOO Dyskutant (8,400 p.)

93,335 zapytań

142,328 odpowiedzi

322,406 komentarzy

62,670 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...