Kilka pytań z MySql

0

Witajcie,

Mam kilka pytań, które powinny rozwiązać moje problemy ;)

  1. Jak łącząc ze sobą 2 tabele, gdzie tabela pierwsza jest jakby tabelą słownikową i nie zawiera duplikatów po złączeniu z drugą tabelą, która zawiera wiele pasujących rekordów do każdego z rekordów z tabeli 1 (relacja jeden do wielu) otrzymać w wyniku tylko jeden rekord z tabeli 2 zestawiony z rekordem z tabeli 1. Chodzi o to, aby nie powielać rekordów, jeżeli w tabeli 2 jest więcej pasujących do pojedynczego rekordu z tabeli 1. Chcę też w ten sposób uniknąć DISTINCT'a i GROUP BY

  2. Wiadomo, że aby przyśpieszyć wykonywanie się GROUP BY należy stworzyć indeks z kolumnami po których chcemy grupować, ale żeby mysql skorzystał z tego indeksa przy grupowaniu muszą być te kolumny wymienione i tylko one (żadnych innych) po słowie SELECT.
    Wiadomo również, że w większości potrzebujemy pobrać inne kolumny niż te po których grupujemy. Czy ma ktoś pomysł jak to zrobić, aby w zapytaniu pobrać więcej kolumn i jednocześnie wykorzystać indeks z kolumnami po których chcę GRUPOWAĆ?

0
  1. Przykład w MSSQL 2008
CREATE TABLE a
(
  id int
);

CREATE TABLE b
(
  id int,
  text varchar(10)
);

INSERT INTO a VALUES(1),(2),(3);

INSERT INTO b VALUES (1, '111'),(2, '222'),(3, '333'),(1, '444'),(2, '555'),(3, '666'),(1, '777'),(2, '888'),(3, '999');

SELECT t.text
FROM
(
  SELECT b.text, ROW_NUMBER() OVER (PARTITION BY a.id ORDER BY b.text) as rownumber
  FROM a
  INNER JOIN b ON a.id = b.id
) t
WHERE t.rownumber = 1;
0

Dzięki, ale to nie o to chodziło.

Tutaj nie masz w ogóle relacji po pierwsze, a po drugie to zapytanie nie jest zbyt optymalne.

0
Nowicjuszzz napisał(a)

Tutaj nie masz w ogóle relacji po pierwsze

Jest relacja jeden do wielu, a jeżeli jej nie widzisz to nie mamy o czym gadać :) Poza tym jeżeli masz w drugiej tabeli wiele zdublowanych rekordów to optymalizację zacząłbym od przeprojektowania tabeli i aplikacji :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1