[MySQL] złączenie 2 tabel (subquery, LIKE ?)
S.Lewandowski - 27-08-2007 00:00
[MySQL] złączenie 2 tabel (subquery, LIKE ?)
Witam, mam taki problem:
2 tabele:
tabela1 id | user_id | word | ------------------------- 1 | 1 | ala | 2 | 1 | obraz | 3 | 2 | drzwi | 4 | 3 | lampa | 5| 2 | zegar | ........
tabela2 id | string | --------------------------- 1 | ala ma kota | 2 | czarne drzwi | 3 | zielony rower | 4 | bardzo_fajny_zegar | .........
Jak wyciagnąć jednym zapytaniem, ew. z użyciem podzapytania wszyskich użytkowników, których 'tabela1.word' zawiera się w 'tabela2.string' ? Czyli w tym wypadku chciałym otrzymać coś takiego:
user_id | word | string | --------------------------------------------- 1 | ala | ala ma kota | 2 | drzwi | czarne drzwi | 2 | zegar | bardzo_fajny_zegar |
Pozdrawiam i z góry dziękuję za pomoc
Marcin - 27-08-2007 00:00
S.Lewandowski pisze: > Witam, > mam taki problem: > > 2 tabele: > > tabela1 > id | user_id | word | > ------------------------- > 1 | 1 | ala | > 2 | 1 | obraz | > 3 | 2 | drzwi | > 4 | 3 | lampa | > 5| 2 | zegar | > ....... > > tabela2 > id | string | > --------------------------- > 1 | ala ma kota | > 2 | czarne drzwi | > 3 | zielony rower | > 4 | bardzo_fajny_zegar | > ........ > > Jak wyciagnąć jednym zapytaniem, ew. z użyciem podzapytania wszyskich > użytkowników, których 'tabela1.word' zawiera się w 'tabela2.string' ? Czyli > w tym wypadku chciałym otrzymać coś takiego: > > user_id | word | string | > --------------------------------------------- > 1 | ala | ala ma kota | > 2 | drzwi | czarne drzwi | > 2 | zegar | bardzo_fajny_zegar | > > Pozdrawiam i z góry dziękuję za pomoc > > Na przykład tak:
mysql> select t1.user_id, t1.word, t2.string -> from tabela1 as t1 inner join tabela2 as t2 -> on t2.string like concat('%',t1.word,'%'); +---------+-------+--------------------+ | user_id | word | string | +---------+-------+--------------------+ | 1 | ala | ala ma kota | | 2 | drzwi | czarne drzwi | | 2 | zegar | bardzo_fajny_zegar | +---------+-------+--------------------+ 3 rows in set (0.00 sec)
Z tym że user_id i word będą się powtarzać jeśli tabela1.word będzie się mieścić w kilku wierszach z tabeli tabela2, ale skoro chcesz wyświetlać tabela2.string to chcesz chyba wyświetlić wszystkie pasujące stringi
Marcin - 27-08-2007 00:00
Marcin pisze: > S.Lewandowski pisze: >> Witam, >> mam taki problem: >> >> 2 tabele: >> >> tabela1 >> id | user_id | word | >> ------------------------- >> 1 | 1 | ala | >> 2 | 1 | obraz | >> 3 | 2 | drzwi | >> 4 | 3 | lampa | >> 5| 2 | zegar | >> ....... >> >> tabela2 >> id | string | >> --------------------------- >> 1 | ala ma kota | >> 2 | czarne drzwi | >> 3 | zielony rower | >> 4 | bardzo_fajny_zegar | >> ........ >> >> Jak wyciagnąć jednym zapytaniem, ew. z użyciem podzapytania wszyskich >> użytkowników, których 'tabela1.word' zawiera się w 'tabela2.string' ? >> Czyli >> w tym wypadku chciałym otrzymać coś takiego: >> >> user_id | word | string | >> --------------------------------------------- >> 1 | ala | ala ma kota | >> 2 | drzwi | czarne drzwi | >> 2 | zegar | bardzo_fajny_zegar | >> >> Pozdrawiam i z góry dziękuję za pomoc >> > Na przykład tak: > > mysql> select t1.user_id, t1.word, t2.string > -> from tabela1 as t1 inner join tabela2 as t2 > -> on t2.string like concat('%',t1.word,'%'); > +---------+-------+--------------------+ > | user_id | word | string | > +---------+-------+--------------------+ > | 1 | ala | ala ma kota | > | 2 | drzwi | czarne drzwi | > | 2 | zegar | bardzo_fajny_zegar | > +---------+-------+--------------------+ > 3 rows in set (0.00 sec) > > > Z tym że user_id i word będą się powtarzać jeśli tabela1.word będzie się > mieścić w kilku wierszach z tabeli tabela2, ale skoro chcesz wyświetlać > tabela2.string to chcesz chyba wyświetlić wszystkie pasujące stringi
Bo jeśli np. zależy ci tylko na pobraniu user_id spełniających twój warunek, to można tak:
mysql> select distinct t1.user_id -> from tabela1 as t1 -> where exists ( select NULL -> from tabela2 as t2 -> where t2.string like concat('%',t1.word,'%') -> ); +---------+ | user_id | +---------+ | 1 | | 2 | +---------+ 2 rows in set (0.01 sec)
Przy czym nie spodziewaj się przy dużej ilości wierszy w tabeli tabela2, że te zapytania będą "śmigać".
S.Lewandowski - 27-08-2007 00:00
Użytkownik "Marcin" <m_wroblewski@gazeta.pl> napisał w wiadomości news:fasakn$qj9$1@inews.gazeta.pl... > S.Lewandowski pisze: >> Witam, >> mam taki problem: >> >> 2 tabele: >> >> tabela1 >> id | user_id | word | >> ------------------------- >> 1 | 1 | ala | >> 2 | 1 | obraz | >> 3 | 2 | drzwi | >> 4 | 3 | lampa | >> 5| 2 | zegar | >> ....... >> >> tabela2 >> id | string | >> --------------------------- >> 1 | ala ma kota | >> 2 | czarne drzwi | >> 3 | zielony rower | >> 4 | bardzo_fajny_zegar | >> ........ >> >> Jak wyciagnąć jednym zapytaniem, ew. z użyciem podzapytania wszyskich >> użytkowników, których 'tabela1.word' zawiera się w 'tabela2.string' ? >> Czyli >> w tym wypadku chciałym otrzymać coś takiego: >> >> user_id | word | string | >> --------------------------------------------- >> 1 | ala | ala ma kota | >> 2 | drzwi | czarne drzwi | >> 2 | zegar | bardzo_fajny_zegar | >> >> Pozdrawiam i z góry dziękuję za pomoc > Na przykład tak: > > mysql> select t1.user_id, t1.word, t2.string > -> from tabela1 as t1 inner join tabela2 as t2 > -> on t2.string like concat('%',t1.word,'%'); > +---------+-------+--------------------+ > | user_id | word | string | > +---------+-------+--------------------+ > | 1 | ala | ala ma kota | > | 2 | drzwi | czarne drzwi | > | 2 | zegar | bardzo_fajny_zegar | > +---------+-------+--------------------+ > 3 rows in set (0.00 sec) > > > Z tym że user_id i word będą się powtarzać jeśli tabela1.word będzie się > mieścić w kilku wierszach z tabeli tabela2, ale skoro chcesz wyświetlać > tabela2.string to chcesz chyba wyświetlić wszystkie pasujące stringi
Działa jak należy. Wielkie dzięki :)
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
[mysql] =?ISO-8859-2?Q?Za=E6mienie=2E=2E=2E_jak_wy=B6wietli=E6?==?ISO-8859-2?Q?=2E=2E=2E?=
[MySQL] =?ISO-8859-2?Q?Wy=B6wietlenie_kolejnej_pozycji=2C_?==?ISO-8859-2?Q?jak=B1_mia=B3by_dany_rekord=2C_gdybym_czyta=B3 _?==?ISO-8859-2?Q?wg_konkretnych_kryteri=F3w=2E_Da_si=EA_=3F?=
[mysql 4.0.x] przenoszenie kolum =?ISO-8859-2?Q?mi=EAdzy_bazam?==?ISO-8859-2?Q?i_cd_=2E=2E=2E_?=
[MySQL] =?ISO-8859-2?Q?z=B3=B1czenie_tabeli_u=BFytkownik_i?==?ISO-8859-2?Q?_zdj=EAcia_z_wyborem_zdj=EAcia_domy=B6lnego?=
[MySQL] Jak =?ISO-8859-2?Q?wpisa=E6_do_tabeli_pozycje_dl?==?ISO-8859-2?Q?a_wierszy_gdybym_te_wiersze_wybiera=B3_w_ok?== ?ISO-8859-2?Q?re=B6lonej_kolejno=B6ci_=3F?=
Gdzie MySQL 4.1, a gdzie 5.0?
[MySQL 4.0...4.1] zabezpieczenie przed =?ISO-8859-2?Q?jednoczesn?==?ISO-8859-2?Q?=B1_edycj=B1?=
[MS SQL] "set names" (mySQL) w MS SQL
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
MySQL - jak =?ISO-8859-2?Q?wyeksportowa=E6_zawarto=B6=E6_wie?==?ISO-8859-2?Q?lkiej_tabeli?=
zanotowane.pldoc.pisz.plpdf.pisz.plnawschodzie.xlx.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|