Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: [query] wyszukanie usera z wszystkich słów zadanymi...

Witam,

Tytuł posta nie do końca opisuje problem, ale nie wiedziałem jak to nazwać :)

Chodzi o to, że mam 3 tabele z danymi: tagi, umiejetnosci i jezyk_obcy.

Wpisując fraze: taniec gdańsk
potrzebuje wykonać zapytanie, które zwróci mi osobnika mającego np. w tabeli tagi słowo gdańsk, a w tabeli umiejetnosci słowo taniec

W ogóle nie mogę tego ogarnąć.

Proszę o pomocJan Lipmann edytował(a) ten post dnia 06.03.11 o godzinie 08:18

konto usunięte

Temat: [query] wyszukanie usera z wszystkich słów zadanymi...

Dokładasz dodatkową tabelę, która posiada kolumny

user_id,
select GROUP_CONCAT( tag separator " ") from tags GROUP BY user_id,
select GROUP_CONCAT( city separator " ") from cities GROUP BY user_id

następnie zakładasz indeks full text. Dobrze byłoby trigger na modify tabel tags i cities, by zarzadzać tabelą z wyszukiwaniem full textowym.
Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: [query] wyszukanie usera z wszystkich słów zadanymi...

Tylko ja mam tak zbudowana baze:


# Dump of table tagi
# ------------------------------------------------------------

CREATE TABLE `tagi` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`wartosc` varchar(200) NOT NULL,
`count` bigint(20) DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `wartosc` (`wartosc`)
) ENGINE=InnoDB AUTO_INCREMENT=2228 DEFAULT CHARSET=utf8;



# Dump of table tagi_aktorzy
# ------------------------------------------------------------

CREATE TABLE `tagi_aktorzy` (
`tag_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`aktor_id` bigint(20) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`tag_id`,`aktor_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


W jaki sposób zbudowac dodatkowa tabele z CONCAT-ami?

Pozdrawiam

konto usunięte

Temat: [query] wyszukanie usera z wszystkich słów zadanymi...

To będzie jakoś tak:


CREATE TABLE foo
AS
SELECT a.actor_id, GROUP_CONCAT(wartosc SEPARATOR " ") as tekst
FROM
tagi_aktowrzy a LEFT JOIN tagi t ON a.tag_id = t.id
GROUP BY ( actor_id );

pamiętaj Engine = myISAM, bo tylko na takiej tabelce założysz FULL TEXT index.

Następnie robisz triggera, w którym umieszczasz:

CREATE TRIGGER fooXXX na tabeli TAGS
FOR EACH ROW.. dla zdarzenia AFTER INSERT+UPDATE

pobierasz wszystkie tagi dla danego aktora, robisz GROUP_CONCAT i INSERT z obsługą update'a.

http://dev.mysql.com/doc/refman/5.0/en/create-trigger....
http://dev.mysql.com/doc/refman/5.0/en/insert-on-dupli...

gn8.
Jan Lipmann

Jan Lipmann CEO/Founder @ Likomp
iOS Development

Temat: [query] wyszukanie usera z wszystkich słów zadanymi...

Ja to rozwiązałem poprostu tak:



SELECT aktorzy.*, GROUP_CONCAT(tags.wartosc SEPARATOR " ") as tagi FROM aktorzy,tags_aktorzy,tags WHERE aktorzy.id = tags_aktorzy.aktor_id AND tags_aktorzy.tag_id = tags.id GROUP BY (aktorzy.id) HAVING (tagi LIKE '%taniec%' AND tagi LIKE '%gdansk%')



Wczesniej zrobilem tylko jedna tabele ze wszystkimi metadanymi z kolumna typ, gdzie nazwa typu jest rowna umiejetnosci, tagi

I dziala

konto usunięte

Temat: [query] wyszukanie usera z wszystkich słów zadanymi...

Jan: Koła na nowo nie odkryjesz, fulltext zwraca ci procentową zgodność ze wzorcem (tekstem), poza tym indeksuje każdy z wyrazów i nie przetwarza całego string'a. Jeżeli chcesz z samych tag'ów korzystać to raczej szkoda czasu na zabawę.

Następna dyskusja:

pytanie o query




Wyślij zaproszenie do