NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: MySQL - Sečtení 2 hodnot a porovnání

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
katrincsak
Člen
Avatar
katrincsak:11.11.2016 16:00

Zdravím,

mohl bych poprosit o pomoc?

Mám databázi několik tisíc skladeb a každá skladba má 2 hodnoty. Počet zobrazení a počet stažení. Potřeboval bych tyhle 2 hodnoty sečíst a zároveň seřadit od největšího po nejmenší. Potřeboval bych tedy pomoct se složením SQL příkazu, abych to nemusel řešit zbytečně složitě.

Děkuji za pomoc

 
Odpovědět
11.11.2016 16:00
Avatar
Michal
Člen
Avatar
Odpovídá na katrincsak
Michal:11.11.2016 16:07

Šlo by něco takového?

SELECT zobrazeni + stazeni AS sloupec FROM tabulka ORDER BY sloupec DESC
Editováno 11.11.2016 16:08
 
Nahoru Odpovědět
11.11.2016 16:07
Avatar
katrincsak
Člen
Avatar
Odpovídá na Michal
katrincsak:11.11.2016 16:12

Jestli dojde k sečtení a pak teprve k porovnání, tak by to mohlo být ono. Náhodou nevíš jak složité a náročné pro výpočet by to mohlo být v případě násobení čísel. V případě že bych to ukládal, musel bych použit datový typ BIGINT (8 bitový) . Neumím si představit náročnost.

 
Nahoru Odpovědět
11.11.2016 16:12
Avatar
Michal
Člen
Avatar
Odpovídá na katrincsak
Michal:11.11.2016 16:36

Shodou náhod mám po ruce databázi s 10 305 položkami, od každého způsobu jsem vyzkoušel 10 pokusů a musím říct, že pro tak jednoduchý výpočet jako je sečtení/vynásobení dvou čísel se nevyplatí zakládat nový sloupec. Není to nijak výrazně rychlejší a navíc to má větší paměťové nároky.

Násobení:

SELECT zobrazeni * stazeni AS sloupec FROM tabulka ORDER BY sloupec DESC
// 0.0041 s
// 0.0050 s
// 0.0040 s
// 0.0041 s
// 0.0040 s
// 0.0041 s
// 0.0048 s
// 0.0041 s
// 0.0049 s
// 0.0040 s
// Průměrně 0.00431 s

Sčítání:

SELECT zobrazeni + stazeni AS sloupec FROM tabulka ORDER BY sloupec DESC
// 0.0049 s
// 0.0041 s
// 0.0042 s
// 0.0039 s
// 0.0039 s
// 0.0039 s
// 0.0041 s
// 0.0040 s
// 0.0039 s
// 0.0040 s
// Průměrně 0,00409 s

Uložení součtu do db jako 8b BIGINT:

SELECT sloupec FROM tabulka ORDER BY sloupec DESC
// 0.0046 s
// 0.0045 s
// 0.0047 s
// 0.0036 s
// 0.0037 s
// 0.0046 s
// 0.0038 s
// 0.0047 s
// 0.0038 s
// 0.0037 s
// Průměrně 0,00417 s
Editováno 11.11.2016 16:36
 
Nahoru Odpovědět
11.11.2016 16:36
Avatar
katrincsak
Člen
Avatar
Odpovídá na Michal
katrincsak:11.11.2016 16:40

Tak to je pohoda, prakticky je to stejné.

Jak v tomto příkazu MySQL zapíšu sloupce, které má selectovat? víceméně potřebuji selectnout celou tabulku s porovnáním dat a následně je vypsat. Nedaří se mi do toho příkazu určit které sloupce a nebo operátor '*'

 
Nahoru Odpovědět
11.11.2016 16:40
Avatar
Michal
Člen
Avatar
Odpovídá na katrincsak
Michal:11.11.2016 16:46

Jednotlivé sloupce stačí oddělit čárkou:

SELECT *, zobrazeni + stazeni AS sloupec FROM tabulka ORDER BY sloupec DESC

Případně, pokud chceš vypsat tabulku bez onoho součtu (zobrazeni + stazeni), který použiješ pouze pro seřazení, můžeš napsat i toto:

SELECT * FROM tabulka ORDER BY stazeni + zobrazeni DESC
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
11.11.2016 16:46
Avatar
katrincsak
Člen
Avatar
katrincsak:11.11.2016 17:01

Paráda, moc děkuji. Jde vidět, že MySQL ovládáš velice dobře. Měl bych ještě jeden dotaz, ale to asi bez úpravy ukládání dat nepůjde.

Zobrazení je na 1 serveru a stažení na druhém serveru :D To aby to nebylo tak jednoduché, je možné nějak joinout 2 tabulky na 2 různých serverech? Vidím to ale na to, že se data stažení začnou ukládat na server číslo 1 a aktuální hodnoty jen přenesu.

 
Nahoru Odpovědět
11.11.2016 17:01
Avatar
Michal
Člen
Avatar
Odpovídá na katrincsak
Michal:11.11.2016 17:21

Pokud by šlo o dvě různé databáze na stejném serveru, šlo by to takto:

SELECT * FROM databaze1.tabulka JOIN databaze2.tabulka ON databaze1.tabulka.id = databaze2.tabulka.id

Ovšem pokud se jedná o dva různé servery, bude to problém. Šel by použít sp_addlinkedser­ver od Microsoftu, ve kterém by syntaxe byla analogická (server.databa­ze.tabulka.slou­pec), ovšem pro MySQL jsem nic takového nenašel. Něco jsem se dočetl o FEDERATED Storage Engine, ale s tím ti už poradit nedokážu.

 
Nahoru Odpovědět
11.11.2016 17:21
Avatar
katrincsak
Člen
Avatar
Odpovídá na Michal
katrincsak:11.11.2016 17:42

Tohle jsem očekával že nebude tak lehce realizovatelné jako můj hlavní dotaz, což nevadí. Do budoucna stejně potřebuji některá data ukládat na hlavní server a tak to jen odložím a tohle udělám později spolu s dalšími věcmi.

I tak ti moc děkuji za tvůj čas a hodně jsi mi pomohl !

 
Nahoru Odpovědět
11.11.2016 17:42
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.