Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> index podzapytania
nospor
post
Post #1





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Hejka, mam taką zagwostkę:
Jest sobie zapytanie:
  1. SELECT @nr:=@nr+1,IF(ID=@id, @idnr := @nr,@idnr=@idnr),ID FROM f_post WHERE FK_TOPIC=2 ORDER BY f_post.ID ASC

No i ładnie mi bierze index FK_TOPIC.
Explain:
Cytat
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1 SIMPLE f_post ref FK_TOPIC FK_TOPIC 4 const 2 Using where; Using filesort
Wziął mi pod uwagę dwa rekordy.

Daję teraz to w podzapytanie:
  1. SELECT @idnr AS nr FROM
  2. (SELECT @nr:=@nr+1,IF(ID=@id, @idnr := @nr,@idnr=@idnr),ID FROM f_post WHERE FK_TOPIC=2 ORDER BY f_post.ID ASC ) podsel WHERE podsel.ID = @id;

I już mi nie uwzględnia FK_TOPIC jako klucza
Cytat
idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
1 PRIMARY <derived2>ALL(NULL)(NULL)(NULL)(NULL)2Using where
2 DERIVED f_post ALL FK_TOPIC FK_TOPIC 4 118 Using filesort

Bierze pod uwagę wszystkie rekordy (118)

O co chodzi?Mam chwilowe zaćmienie związane z poszukiwaniem samochodu (IMG:style_emoticons/default/smile.gif)

ps: wystarczy ze wywalę ORDER BY ID asc i już gra jak ta lala, szuka po dwóch rekordach.
Czemu normalnie dziala niezależnie od order by, a w podzapytaniu trzeba wywalic order by by poszło normalnie
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




@cojak to że ty sensu nie widzisz nie znaczy że go nie ma (IMG:style_emoticons/default/winksmiley.jpg)
Tutaj jak najbardziej jest sens. A danie tego order by na koncu da zupelnie inny wynik niż oczekiwany.

O to całe zapytanie:
  1. SET @id=5,@nr = 0, @idnr = 0;
  2. SELECT @idnr AS nr FROM
  3. (SELECT @nr:=@nr+1,IF(ID=@id, @idnr := @nr,@idnr=@idnr),ID FROM f_post WHERE FK_TOPIC=2 ORDER BY ID ASC) podsel WHERE podsel.ID = @id;


EXPLAIN EXTENDED :
Kod
id    select_type    table    type    possible_keys    key    key_len    ref    rows    filtered    Extra
1    PRIMARY    <derived2>    ALL    null                  null       null     null    2    100.00    Using where
2    DERIVED    f_post    ALL    FK_TOPIC    FK_TOPIC    4        118    1.69    Using filesort


a o to struktura tabeli (wywalilem niepotrzebne pola):
  1. CREATE TABLE `f_post` (
  2. `ID` int UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `FK_TOPIC` int UNSIGNED NOT NULL COMMENT 'Id tematu',
  4. `CDATE` datetime NOT NULL COMMENT 'Data utworzenia',
  5. `ACTIVE` tinyint NOT NULL DEFAULT 1 COMMENT '0 - nieaktywny, 1 - aktywny',
  6. PRIMARY KEY (`ID`),
  7. KEY `FK_TOPIC` (`FK_TOPIC`),
  8. KEY `CDATE` (`CDATE`),
  9. KEY `ACTIVE` (`ACTIVE`)
  10. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Tabela posta';
  11.  


edit:
rozwiązaniem było założenie indexu na dwa pola jednoczesnie: na to po którym szukamy i na to po którym sortujemy
  1. ALTER TABLE f_post
  2. ADD KEY CDATE2 (FK_TOPIC,CDATE);

Dałem CDATE gdyż zmieniłem sortowanie na date a nie ID
  1. SET @id=5,@nr = 0, @idnr = 0;
  2. SELECT @idnr AS nr FROM
  3. (SELECT @nr:=@nr+1,IF(ID=@id, @idnr := @nr,@idnr=@idnr),ID FROM f_post WHERE FK_TOPIC=2 ORDER BY CDATE ASC) podsel WHERE podsel.ID = @id;
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.10.2025 - 00:02