konto usunięte

Temat: Zapytanie mysql, where

Mam tabele terms_relationship a w niej dwie kolumny term_id i post_id.
Każdy post może mieć X tagów.

Potrzebuje napisać zapytanie które pobierze mi wszystkie posty który mają stworzoną relacje z tagami z jakiejś tablicy.

Dopóki potrzebował bym posty które mają jeden tag to byłby to po prostu zwykły where term_id = "$x" ale ja potrzebuje posty które mają 2 tagi lub więcej.Robert S. edytował(a) ten post dnia 19.11.10 o godzinie 19:24
Krzysztof N.

Krzysztof N. CEO. Aplikacje
internetowe i
mobilne. Symfony,
Zend.

Temat: Zapytanie mysql, where

Robert S.:
Mam tabele terms_relationship a w niej dwie kolumny term_id i post_id.
(...)
potrzebuje posty które mają 2 tagi lub więcej
Na podstawie tego co napisałeś proponuję takie zapytanie:
SELECT post_id
FROM terms_relationship
GROUP BY term_id
HAVING COUNT(*) > 2

konto usunięte

Temat: Zapytanie mysql, where

Źle wytłumaczyłem. Chce wyciągnąć wszystkie posty które mają stworzone relacje z tagami o id 125, 124 i 300 . Czyli np mam następujące rekordy:

post_id | term_id
2 | 125
2 | 124
2 | 300
1 | 125
1 | 124
3 | 300

I w moim docelowym zapytaniu otrzymuje tylko "2"

konto usunięte

Temat: Zapytanie mysql, where

Select post_id, term_id from terms_relationship where post_id=2;Dawid Rogaczewski edytował(a) ten post dnia 19.11.10 o godzinie 22:30

konto usunięte

Temat: Zapytanie mysql, where

select post_id from terms_relationship where term_id in (125, 124, 300)


a jeśli para post_id, term_id nie jest unikalna to może jeszcze się przydać

select distinct post_id from terms_relationship where term_id in (125, 124, 300)
Adrian Serafin edytował(a) ten post dnia 19.11.10 o godzinie 22:56

konto usunięte

Temat: Zapytanie mysql, where

Niestety żaden z Was nie ma racji. Albo inaczej, macie rację tylko do konkretnego przypadku 6 przykładowych rekordów, które podał autor wątku.

Globalnie, przy kilku tysiącach i więcej rekordów w takiej tabeli, wpisywanie id "z ręki" mija sie z celem.

Poprawne zapytanie wykorzystujące najzwyklejsze grupowanie ;)

SELECT post_id
FROM terms_relationship
GROUP BY post_id
HAVING COUNT(post_id) >= 2


Dla przykładowej tabeli danych zwróci wynik:

post_id
2
1

Dodam tylko, że można dodać sobie jeszcze sortowanie i mieć wyniki od największej do najmniejszej ilości tagów :)

konto usunięte

Temat: Zapytanie mysql, where

Ciągle to nie jest to o co mi chodziło. Interesują mnie tylko posty które mają np
- 3 tagi o id 127,128,129
- 2 tagi o id 258,234

Czyli jeśli jakis post będzie miał tylko tag 127 to mnie nie interesuje ma mieć konretnie te trzy które podałem.

Żeby się upewnić że zostałem dobrze zrozumiany powiem dokładnie o co chodzi.

Mam posty na blogu z róznymi tagami np (francja, kanada, izreal, hiszpania)

Użytkownik chce znaleźć wszystkie posty które są jednoczesnie o FRANCJI i IZRAELU
Posty o samej francji nie są mu potrzebne :)Robert S. edytował(a) ten post dnia 20.11.10 o godzinie 00:02

konto usunięte

Temat: Zapytanie mysql, where

Może trochę na około, ale mam:

SELECT tr.post_id, GROUP_CONCAT(tr.term_id ORDER BY tr.term_id) tagi
FROM terms_relationship tr
GROUP BY tr.post_id
HAVING tagi = '124,125,300'


Warunek to ustawienie w aplikacji id tagów w określonej kolejności, najlepiej ASC/DESC, wtedy w ciągu
tagi = '124,125,300'
podać po przecinku posortowane id tagów.

Jest to chyba jedyne rozwiązanie, które (biorąc pod uwagę poprzedni przykład)
Robert S.:
mam następujące rekordy:

post_id | term_id
2 | 125
2 | 124
2 | 300
1 | 125
1 | 124
3 | 300

dla tagów o id 124,125,300 wyciągnie post 2, a dla tagów 124,125 wyciągnie post 1, a nie 1+2.Sebastian Zaborowski edytował(a) ten post dnia 20.11.10 o godzinie 01:09

konto usunięte

Temat: Zapytanie mysql, where

a jak chce żeby dla 124+125 wyciągnął 1 + 2 ?

konto usunięte

Temat: Zapytanie mysql, where

Robert S.:
a jak chce żeby dla 124+125 wyciągnął 1 + 2 ?

tagi like '%124%125%'
Adam W.

Adam W. senior php
developer, Symfony

Temat: Zapytanie mysql, where

Robert S.:
Mam tabele terms_relationship a w niej dwie kolumny term_id i post_id.
Każdy post może mieć X tagów.

Potrzebuje napisać zapytanie które pobierze mi wszystkie posty który mają stworzoną relacje z tagami z jakiejś tablicy.

Dopóki potrzebował bym posty które mają jeden tag to byłby to po prostu zwykły where term_id = "$x" ale ja potrzebuje posty które mają 2 tagi lub więcej.Robert S. edytował(a) ten post dnia 19.11.10 o godzinie 19:24


to powinno być coś takiego:


//tablica z id tagów
$tablica = array(124, 125, 300);

$q = 'select * from terms_relationship where term_id in ('.implode(',', $tablica).') group by post_id having count(term_id) = '.count($tablica);


http://pastebin.com/42xZ2vFk

konto usunięte

Temat: Zapytanie mysql, where

No i dokładnie o to mi chodziło :)
Dzięki Adam

konto usunięte

Temat: Zapytanie mysql, where

i pieknie zajezdzamy baze klauzula IN..

pamietamy, by uzywac _zawsze_ EXISTS.

konto usunięte

Temat: Zapytanie mysql, where

Adam W.:
Robert S.:
Mam tabele terms_relationship a w niej dwie kolumny term_id i post_id.
Każdy post może mieć X tagów.

Potrzebuje napisać zapytanie które pobierze mi wszystkie posty który mają stworzoną relacje z tagami z jakiejś tablicy.

Dopóki potrzebował bym posty które mają jeden tag to byłby to po prostu zwykły where term_id = "$x" ale ja potrzebuje posty które mają 2 tagi lub więcej.Robert S. edytował(a) ten post dnia 19.11.10 o godzinie 19:24


to powinno być coś takiego:


//tablica z id tagów
$tablica = array(124, 125, 300);

$q = 'select * from terms_relationship where term_id in ('.implode(',', $tablica).') group by post_id having count(term_id) = '.count($tablica);


http://pastebin.com/42xZ2vFk
Dodam jeszcze tylko, że jeżeli tablica jest dynamiczna to warto przy implode() użyć funkcji intval():

//tablica z id tagów
$tablica = array(124, 125, 300);

$q = 'select * from terms_relationship where term_id in ('.implode(',', array_map('intval', $tablica)).') group by post_id having count(term_id) = '.count($tablica);

http://pastebin.qzminski.com/28
Adam W.

Adam W. senior php
developer, Symfony

Temat: Zapytanie mysql, where

Wojciech Zbigniew Piotrowicz:
i pieknie zajezdzamy baze klauzula IN..

pamietamy, by uzywac _zawsze_ EXISTS.

a dlaczego w doctrine nie udostępnili takiej metody?
jest tylko whereIn i whereNotIn.

konto usunięte

Temat: Zapytanie mysql, where

Robert S.:
No i dokładnie o to mi chodziło :)
Dzięki Adam

Skoro o to Ci chodziło to czemu tego sam nie zrobiłeś albo nie użyłeś podanego rozwiązania? Przecież to zapytanie jest najbanalniejsze z możliwych i było już Ci podawane wcześniej (nie tylko przeze mnie).

IMHO sam nie wiedziałes czego chcesz.Sebastian Zaborowski edytował(a) ten post dnia 21.11.10 o godzinie 13:56



Wyślij zaproszenie do