Portál AbcLinuxu, 10. května 2025 14:02

Dotaz: Spojení tabulek na základě částečné shody klíče

16.4.2011 02:50 konstabl
Spojení tabulek na základě částečné shody klíče
Přečteno: 409×
Odpovědět | Admin
Ahoj. Mám v MySQL 2 tabulky, kvůli přehlednosti uvedu jen jednoduchý příklad:
lide

jmeno | vek | povolani
-----------------------
franta| 55  | architekt



povolani

nazev | popis
-------------
ar%kt | nejaky text

Teď bych potřeboval ty 2 tabulky spojit pomocí lide.povolani = povolani.nazev, ovšem v tomto případě není úplná shoda textu. Jak to udělat aby mi to spojovalo i s takovými výrazy?

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

okbob avatar 16.4.2011 07:36 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: Spojení tabulek na základě částečné shody klíče
Odpovědět | | Sbalit | Link | Blokovat | Admin
a

SELECT * FROM lide JOIN povolani ON nazev LIKE lide.povolani

nefunguje?

v SQL muzete spojovat jak chcete - v tom je jeho sila i potencialni nebezpecnost
16.4.2011 11:39 konstabl
Rozbalit Rozbalit vše Re: Spojení tabulek na základě částečné shody klíče
Toto bohužel nefunguje.
16.4.2011 11:41 konstabl
Rozbalit Rozbalit vše Re: Spojení tabulek na základě částečné shody klíče
No vlastně to funguje, stačilo prohodit výrazy na stranách LIKE. Díky.
16.4.2011 11:48 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Re: Spojení tabulek na základě částečné shody klíče
Zkusil jsem teď v H2 obě varianty joinu, a obě dávají očekávaný výsledek. Takže by to muselo být nějaké specifikum MySQL. Co znamená „nefunguje“? Hlásí vám to nějakou chybu, vrací jiné záznamy?
CREATE TABLE lide (
  jmeno VARCHAR,
  vek TINYINT,
  povolani VARCHAR
);

CREATE TABLE povolani (
  nazev VARCHAR,
  popis VARCHAR
);

INSERT INTO lide (jmeno, vek, povolani) VALUES ('Franta', 55, 'architekt');
INSERT INTO povolani (nazev, popis) VALUES ('ar%kt', 'nejaky text');

SELECT * FROM lide JOIN povolani ON lide.povolani LIKE povolani.nazev;
SELECT * FROM lide, povolani WHERE lide.povolani LIKE povolani.nazev;
JMENO  	VEK  	POVOLANI  	NAZEV  	POPIS  
Franta	55	architekt	ar%kt	nejaky text
16.4.2011 15:23 konstabl
Rozbalit Rozbalit vše Re: Spojení tabulek na základě částečné shody klíče
Toto funguje:
SELECT * FROM lide JOIN povolani ON lide.povolani LIKE povolani.nazev;
toto nefungovalo:
SELECT * FROM lide JOIN povolani ON povolani.nazev LIKE lide.povolani;
Ale je to celkem logické chování.
Bilbo avatar 16.4.2011 14:07 Bilbo | skóre: 29
Rozbalit Rozbalit vše Re: Spojení tabulek na základě částečné shody klíče
Odpovědět | | Sbalit | Link | Blokovat | Admin
Otázkou je, jestli by to nešlo řešit jinak - při spojování přes LIKE nelze použít index a ve chvíli kdy v tabulkách bude více záznamů, tak to bude pomalé (v zásadě MySQL musí pro každý řádek v tabulce povolání projít celou tabulku lide, tedy pokud je v jedné tabulce M a v druhé N záznamů, tak to musí projít M x N záznamů a ve chvíli kdy tam budou tisíce nebo i více záznamů, tak se začne asi projevovat jistá pomalost)

Na druhou stranu, pokud bude select dělán tak, že z povolání se bude vybírat max. jeden nebo dva řádky a pak spojovat, tak se sice musí procházet párkrát celá tabulka lidé, ale nebude to rychlostně až taková katastrofa, pokud nebude tabulka s lidmi příliš velká.
Big brother is not watching you anymore. Big Brother is telling you how to live...
okbob avatar 16.4.2011 16:06 okbob | skóre: 30 | blog: systemakuv_blog | Benešov
Rozbalit Rozbalit vše Re: Spojení tabulek na základě částečné shody klíče
Já předpokládám, že se jedná o jednorázovou úlohu - LIKE v JOINu znamená vždy kartézský součin s filtrem - jinými slovy - nested loop. Není to nic, co bych doporučoval používat opakovaně - a pokud to tazatel potřebuje, tak někde udělal chybu - on nebo jeho analytik.
Bilbo avatar 16.4.2011 16:29 Bilbo | skóre: 29
Rozbalit Rozbalit vše Re: Spojení tabulek na základě částečné shody klíče
Vzhledem k tomu, že ty parametry pro like jsou v tabulkách, tak to na jednorázovku moc nevypadá.

Ale pokud ve WHERE je kromě like i jiná podmínka, co z jedné (nebo z obou) z těch tabulek vybere jen několik málo řádků (a ten výběr bude přes nějaký sloupec pro který lze použít index), tak ten kartézský součin nemusí být tak strašný - MySQL by měl nejdřív vyfiltrovat ty zajímavé řádky a až pak půjde s nimi na kartézský součin.
Big brother is not watching you anymore. Big Brother is telling you how to live...
21.4.2011 17:30 l0gik | skóre: 22
Rozbalit Rozbalit vše Re: Spojení tabulek na základě částečné shody klíče
Pokud se ale něco takovýho musí dělat, tak je to na 100% chyba v designu i porušení NF (ta sice není samospasitelná, ale o kvalitě návrhu dosti často dost napoví).

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.