Autor Zpráva
snop
Profil
Dobrý den,
tak mám ještě jeden problém a to následující, pokud v následujícím dotazu MySQL použíju místo create table klauzuli create temporary table, tak dostanu error 1046. Pochopil jsem, že to je problém temporary tables. Ale já je potřebuji použít, kvůli mezivýpočům, ale je možné, že se potkají v databázi náhodou dvě dočasné tabulky a bude problém. Může mi prosím někdo poradit jak to vyřešit, aby nemohl nastat tento problém? Děkuji Ruda

Zde je samotný kód dotazu:
create table temprank (id int, sumrank int);
insert into temprank SELECT id, ((select count(*) FROM cpl_20120101_1 as counter where counter.subject1 <= cpl_20120101_1.subject1) + (select count(*) FROM cpl_20120101_1 as counter where counter.subject2 >= cpl_20120101_1.subject2)) AS 'sumrank' FROM cpl_20120101_1;
create table tempsumrank (id int, sumrank int, rank int);

update temprank set sumrank=null WHERE sumrank = '0';

insert into tempsumrank select id, sumrank, ((select count(*) FROM temprank as counteri where counteri.sumrank <= temprank.sumrank)) from temprank;

drop table tempsumrank;
drop table temprank;

Zde je struktura tabulky s daty:
CREATE TABLE cpl_20120101_1 (id INT NOT NULL AUTO_INCREMENT, fname VARCHAR(255), lname VARCHAR(255), category VARCHAR(255), PRIMARY KEY (`id`), subject1 INT(11), subject2 INT(11));
Kajman
Profil
Zkuste přidat ručně volený engine
create temporary table temprank engine=myisam
SELECT id, (( ...

A k čemu to vlastně využíváte? K vypočtení pořadí jedné zobrazené položky? Nebo na výpis pořadí více položek?

Jak často se v té tabulce mění data. Nevyplatí se vytvořit pomocnou (ne temporary) tabulku při každé změně a používat ji?
snop
Profil
Jde o to, že mám tabulky s hodnotama. A z techto hodnot pomoci select count vytvorim sloupecek s poradim. No a nakonec potrebuju tyhle hodnoty secist a z vysledku opet udelat pomoci select count celkove poradi. Nejak jsem neprisel na jednodussi reseni, pokud beru v uvahu, ze nejde pouzit ORDER BY. To pouzivam napriklad k razeni dle jmena, prijmeni atd.

Pokud pridam specifikaci enginu do vytvareni obouch tabulek takto, tak to stejne nejede, mate nejaky jiny napad, jak na to?

Diky

use souteze;
create temporary table temprank (id int, sumrank int) engine=myisam;
insert into temprank SELECT id, ((select count(*) FROM cpl_20120101_1 as counter where counter.subject1 <= cpl_20120101_1.subject1) + (select count(*) FROM cpl_20120101_1 as counter where counter.subject2 >= cpl_20120101_1.subject2)) AS 'sumrank' FROM cpl_20120101_1;
create temporary table tempsumrank (id int, sumrank int, rank int) engine=myisam;
 
update temprank set sumrank=null WHERE sumrank = '0';
 
insert into tempsumrank select id, sumrank, ((select count(*) FROM temprank as counteri where counteri.sumrank <= temprank.sumrank)) from temprank;

select * from tempsumrank;
 
drop table tempsumrank;
drop table temprank;

Chyba:
Error Code: 1137. Can't reopen table: 'counteri'
Kajman
Profil
snop:
tak to stejne nejede
Ale chyba je už dál - nesmíte používat v dotaze dvakrát tu samou temporary tabulku.

Těžko se radí, když jste ignoroval stěžejní otázky.

Každopádně můžete na osmém řádku použít i něco podobného, jak je ve faq.

INSERT INTO tempsumrank
SELECT id,
       sumrank,
       @radek := @radek + 1 rank
FROM   (SELECT @radek := 0) r,
       temprank t
ORDER  BY (sumrank IS NULL),
          sumrank;

UPDATE tempsumrank,
       (SELECT sumrank,
               Min(rank) rank
        FROM   tempsumrank
        GROUP  BY sumrank
        HAVING COUNT(*) > 1) AS vypocet
SET    tempsumrank.poradi = vypocet.poradi
WHERE  tempsumrank.sumrank = vypocet.sumrank;
Edit: ale tento druhý dotaz asi také nepůjde nad temporary tabulkou, tak si můžete např. ten poddotaz dát do třetí temporary tabulky.

Osobně bych to asi řešil bez temporary tabulek.
Tori
Profil
Kajman:
A k čemu to vlastně využíváte?
Vlákno navazuje na zamčené předchozí: Vnoření dotazu, možná by se mohla sloučit dohromady (když jde o problém s řešením, navrženém v tom předchozím vlákně).
snop
Profil
Tori:
Vlákno navazuje na zamčené předchozí: Vnoření dotazu, možná by se mohla sloučit dohromady (když jde o problém s řešením, navrženém v tom předchozím vlákně).

Nevěděl jsem jestli pokračovat nebo nechat v jenom vlákně, každopádně by se téma lišilo od tématu a byl by to vlastně offtopic.
snop
Profil
Tak jsem vytvořil temporary tabulku 2x a uz je to ok, tady je funkční kód:

BTW: Zajímalo by mě proč nejde jedna dočasná tabulka použít v dotazu dvakrát a obyčejná ano?

create temporary table temprank (id int, sumrank int);
insert into temprank SELECT id, ((select count(*) FROM cpl_20120101_1 as counter where counter.subject1 <= cpl_20120101_1.subject1) + (select count(*) FROM cpl_20120101_1 as counter where counter.subject2 >= cpl_20120101_1.subject2)) AS 'sumrank' FROM cpl_20120101_1;

create temporary table temprank2 (id int, sumrank int);
insert into temprank2 (SELECT * FROM temprank);

create temporary table tempsumrank (id int, sumrank int, rank int) engine=myisam;
 
update temprank set sumrank=null WHERE sumrank = '0';
update temprank2 set sumrank=null WHERE sumrank = '0';
 
insert into tempsumrank select id, sumrank, ((select count(*) FROM temprank as counter where counter.sumrank <= temprank2.sumrank)) from temprank2;
 
select * from tempsumrank;
 
drop table tempsumrank;
drop table temprank;
drop table temprank2;

Jinak děkuji mockrát za rady!
snop
Profil
OK, takže jsem doufal že je to hotovo, ale teď už pro mě další stupidní věc: Když následující dotaz pustím v MySQL Workbanch tak je to samozřejmě funkční, ale pokud ho pustím skrz mysql_query v PHP, tak mi napíše, že je chyba na druhém řádku, na začátku. Tedy poblíž tohoto místa abych byl přesný. Můžu tedy poprosit o info, co zase dělám špatně?

Díky Ruda

use souteze;

create temporary table temprank (id int, sumrank int); INSERT INTO temprank SELECT id, ((select count(*) FROM cpl_20120101_1 as counter where counter.subject1 <= cpl_20120101_1.subject1) + (select count(*) FROM cpl_20120101_1 as counter where counter.subject2 >= cpl_20120101_1.subject2)) AS 'sumrank' FROM cpl_20120101_1;

create temporary table temprank2 (id int, sumrank int); insert into temprank2 (SELECT * FROM temprank);

create temporary table tempsumrank (id int, sumrank int, rank int); update temprank set sumrank=null WHERE sumrank = '0';

update temprank2 set sumrank=null WHERE sumrank = '0';

insert into tempsumrank select id, sumrank, ((select count(*) FROM temprank as counter where counter.sumrank <= temprank2.sumrank)) from temprank2;

SELECT CONCAT(lname,' ',fname) AS 'Příjmení a jméno',category AS 'Kategorie' ,subject1 AS 'Výsledek pro Běh',(select count(*) FROM cpl_20120101_1 as counter where counter.subject1 <= cpl_20120101_1.subject1) AS 'Pořadí pro Běh',subject2 AS 'Výsledek pro Skok',(select count(*) FROM cpl_20120101_1 as counter where counter.subject2 >= cpl_20120101_1.subject2) AS 'Pořadí pro Skok' FROM cpl_20120101_1 ORDER BY lname;

drop table tempsumrank;

drop table temprank;

drop table temprank2;  

//edit: nejak jsem vlozil spatne formatovani kodu, tak aby se v tom dalo trochu vyznat
Kajman
Profil
A dáváte do mysql_query vždy jen jeden jediný příkaz (bez středníku) jak to vyžaduje manuál?
snop
Profil
Kajman:
A dáváte do mysql_query vždy jen jeden jediný příkaz (bez středníku) jak to vyžaduje manuál?

Děkuji, vypadá to, že už snad je to funkční dodělám nějaké testovnání a uvidím. Každopádně ještě jednou díky!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0