Jump to content
  • 0

pomoc SQL - Data se nenacitaji


MikhaelE

Dotaz

Zdravicko komunito,

Pouzivam tento system pro ukladani dat na svem serveru: https://github.com/pBlueG/SA-MP-MySQL/blob/master/example_scripts/login_system-cache.pwn

Je pravda ze nemam velkou znalost ohledne SQL ale neco jsem se docetl a na zaklade toho jsem se rozhodl udelat mirne vylepseni ktere mi udela system vic prehlednejsi. Abych nemusel mit 1000 odstavcu v jedne tabulce rozhodl jsem se udelat pro ukladani vic tabulek. Pro tohle jsem pouzil takzvanou MULTI_STATEMENTS funkci ktera dokaze v jedne query jich vyvolat vic.

Ukladani dat timto zpusobem (pres mysql_tquery) funguje perfektne a dokaze to ty MULTI_STATEMENTS precist a ulozit do databaze korektne. Problem ale nastava kdyz se je snazim nacist. Muj kod tedy vypada nejak takhle:

mysql_format(g_SQL, query, sizeof query, "SELECT * FROM `first` WHERE `username` = '%e' LIMIT 1 ; SELECT * FROM `second` WHERE `username` = '%e' LIMIT 1 ; SELECT * FROM `third` WHERE `username` = '%e' LIMIT 1", Player[playerid][Name], Player[playerid][Name], Player[playerid][Name]);

Jo asi to vypada hrozne ale ukladani dat stejnym zpusobem funguje suprove. Tenhle format je tedy ve OnPlayerConnect (ja to chapu tak ze to nacte data z databaze a posle je pak dal pro dalsi spracovani v AssignPlayerData (koukni link vyse).

No kdyz potvrdim prihlasovaci dialog a dojde k funkci AssignPlayerData tak se mi ulozena data nenactou a do mysql error logu se mi vypise tohle:
Field X does not exist
Field X does not exist
Field X does not exist
Field X does not exist

pod X si predstavte nazev odstavce v tabulce. Tyto odstavce tam vsak existuji a jsou v nich ulozena data. Zajimavosti je ze vypsany jsou pouze odstavce tabulek "second" a "third" data tabulky "first" se v pohode nacitaji a to me uz popletlo nadoraz.

Jsem uz zoufaly tento problem resim 4 tydny ano nelzu je to tak. Kdo by mi s timto dokazal pomoci k vyreseni tak beze srandy ziskava muj obdiv.

 

Edited by MikhaelE
Link to comment
Share on other sites

11 odpovědí na tuto otázku

Recommended Posts

  • 0

Si si istý, že to urobí tvoj systém prehľadnejší a nie naopak? 

Podľa čoho sa rozhoduješ, či vložiť hráčove dáta do tabuľky first, second, alebo third? 

Ak to naozaj chceš takto, skús v tom selecte využiť UNION, prípadne UNION ALL na spojenie riadkov z jednotlivých selectov do jedného resultu.

Link to comment
Share on other sites

  • 0

Stále mi nie je jasné, ako určuješ, či hráčove dáta uložiť do tabuľky first, second, alebo third.
Ak máš nejakú funkciu, ktorá to rozhoduje (a nie je to random), možno by si ju mohol použiť znova na výber tabuľky, z ktorej budeš dáta čítať.
Tým pádom by si nemusel robiť select zo všetkých tabuliek, ale iba z jednej.

Btw kde ti vypísalo, že to tvoja verzia mariaDB nepodporuje? Mohol by si sem skopírovať celú tú hlášku?

Link to comment
Share on other sites

  • 0

Tak ja vidim primarni problem ze posilas3 SELECTy zaroven, coz nwm na to obvykle ty systemy nejsou stavene uz kvuli tomu ze tabulky vracene nemuzou mit ruzne struktury. Jako prvni krok bych to rozdelil na 3 samostatne selecty. (Nebo pokud to opravdu potrebujes tak pouzij UNION ALL ?)

 

SELECT * FROM `first` WHERE `username` = '%e' LIMIT 1
UNION ALL
SELECT * FROM `second` WHERE `username` = '%e' LIMIT 1
UNION ALL
ELECT * FROM `third` WHERE `username` = '%e' LIMIT 1

 

Pozor bude fungovat pouze pokud budou SELECTy vracet stejnou table strukturu!

Edited by ATomas
Link to comment
Share on other sites

  • 0
  • Majitel

Chlapci, vy jste s dovolením prasata!

Když už chcete srát 3 tabulky do jednoho výstupu, udělejte to přes JOIN.. Pokud to nejde přes JOIN, děláte to blbě, udělejte to prostě přes 3 různé SQL dotazy nezávisle na sobě..

Link to comment
Share on other sites

  • 0
On 27. 12. 2020 at 10:24, MikhaelE said:

Zdravicko komunito,

Pouzivam tento system pro ukladani dat na svem serveru: https://github.com/pBlueG/SA-MP-MySQL/blob/master/example_scripts/login_system-cache.pwn

Je pravda ze nemam velkou znalost ohledne SQL ale neco jsem se docetl a na zaklade toho jsem se rozhodl udelat mirne vylepseni ktere mi udela system vic prehlednejsi. Abych nemusel mit 1000 odstavcu v jedne tabulce rozhodl jsem se udelat pro ukladani vic tabulek. Pro tohle jsem pouzil takzvanou MULTI_STATEMENTS funkci ktera dokaze v jedne query jich vyvolat vic.

Ukladani dat timto zpusobem (pres mysql_tquery) funguje perfektne a dokaze to ty MULTI_STATEMENTS precist a ulozit do databaze korektne. Problem ale nastava kdyz se je snazim nacist. Muj kod tedy vypada nejak takhle:


mysql_format(g_SQL, query, sizeof query, "SELECT * FROM `first` WHERE `username` = '%e' LIMIT 1 ; SELECT * FROM `second` WHERE `username` = '%e' LIMIT 1 ; SELECT * FROM `third` WHERE `username` = '%e' LIMIT 1", Player[playerid][Name], Player[playerid][Name], Player[playerid][Name]);

Jo asi to vypada hrozne ale ukladani dat stejnym zpusobem funguje suprove. Tenhle format je tedy ve OnPlayerConnect (ja to chapu tak ze to nacte data z databaze a posle je pak dal pro dalsi spracovani v AssignPlayerData (koukni link vyse).

No kdyz potvrdim prihlasovaci dialog a dojde k funkci AssignPlayerData tak se mi ulozena data nenactou a do mysql error logu se mi vypise tohle:
Field X does not exist
Field X does not exist
Field X does not exist
Field X does not exist

pod X si predstavte nazev odstavce v tabulce. Tyto odstavce tam vsak existuji a jsou v nich ulozena data. Zajimavosti je ze vypsany jsou pouze odstavce tabulek "second" a "third" data tabulky "first" se v pohode nacitaji a to me uz popletlo nadoraz.

Jsem uz zoufaly tento problem resim 4 tydny ano nelzu je to tak. Kdo by mi s timto dokazal pomoci k vyreseni tak beze srandy ziskava muj obdiv.

 

Tak v první řadě, SQL db není od toho, aby byla přehledná, ale aby jsi byl schopný z ní efektivně tahat data a ta následně efektivně použil/prezentoval přehledným způsobem.

Ukládání můžeš provést pomocí 3 sql query v jednom tasku, ale select ti bude například v SSMS v tomhle případě vyhazovat 3 tabulky nezávislé na sobě. 

Doporučil bych vytvořit JOIN jak psal ffredyk,  ale úplně nejefektivnější řešení bych viděl v tom mít 1 tabulku. A ještě bych chtěl dodat. Odnauč se používat * v selectu. Zbytečně taháš data, která s největší pravděpodobností ani nepotřebuješ.

Link to comment
Share on other sites

  • 0
před 18 hodinami, ffredyk said:

Chlapci, vy jste s dovolením prasata!

Když už chcete srát 3 tabulky do jednoho výstupu, udělejte to přes JOIN.. Pokud to nejde přes JOIN, děláte to blbě, udělejte to prostě přes 3 různé SQL dotazy nezávisle na sobě..

Ne vzdy JOIN je to co vyzadujes. Ja nijak blize nezkoumal jeho strukturu, ale kdyz mas data v ruznych tabulkach a srovnas si jejich strukturu a potrebujes to k te tabulce pridat, je pouziti UNION naprosto v poradku.

Link to comment
Share on other sites

  • 0
  • Majitel
před 3 hodinami, ATomas said:

Ne vzdy JOIN je to co vyzadujes. Ja nijak blize nezkoumal jeho strukturu, ale kdyz mas data v ruznych tabulkach a srovnas si jejich strukturu a potrebujes to k te tabulce pridat, je pouziti UNION naprosto v poradku.

Ten zátěžový overhead je zbytečný 😅 

Nevím o ničem kde by se UNION nedal nahradit JOINem, v opačném případě máš napíču strukturu tabulek. 

Jak psal Om3n - z hlediska výkonu, čitelnosti a organizace je už spíše nasnadě to všechno narvat do jedny tabulky

Link to comment
Share on other sites

  • 0
před 45 minutami, ffredyk said:

Ten zátěžový overhead je zbytečný 😅 

Nevím o ničem kde by se UNION nedal nahradit JOINem, v opačném případě máš napíču strukturu tabulek. 

Jak psal Om3n - z hlediska výkonu, čitelnosti a organizace je už spíše nasnadě to všechno narvat do jedny tabulky

Kamo asi jsi malo zazil :D Az budu v praci a budu mit cas asi ti ukazu hned nekolik pripadu kde je UNION nevyhnutelny :D A zatez? Na multicoru koho zajima .D Dokud je vysledek vracen do timeoutu je vse cajk a odpusteno :D

A povidej mi tu o spatne navrzene databazi, kdyz na tom fabrika jede 20 let a ver mi ze to nechces menit :D

Edited by ATomas
Link to comment
Share on other sites

  • 0
  • Majitel
před 2 hodinami, ATomas said:

Kamo asi jsi malo zazil :D Az budu v praci a budu mit cas asi ti ukazu hned nekolik pripadu kde je UNION nevyhnutelny :D A zatez? Na multicoru koho zajima .D Dokud je vysledek vracen do timeoutu je vse cajk a odpusteno :D

A povidej mi tu o spatne navrzene databazi, kdyz na tom fabrika jede 20 let a ver mi ze to nechces menit :D

Kámo, mám na starost DB o miliardách záznamů.. Já si tam nemůžu dovolit ani ty posraný JOINy :D Má to sta tisíce requestů za sekundu, tam se nedá už vůbec hnout - takže mi věř, že jsem strávil několik bezesných nocí nad řešením optimalizace posraných SQL :D

  • Haha! 1
Link to comment
Share on other sites

  • 0
před 13 hodinami, ffredyk said:

Ten zátěžový overhead je zbytečný 😅 

Nevím o ničem kde by se UNION nedal nahradit JOINem, v opačném případě máš napíču strukturu tabulek. 

Jak psal Om3n - z hlediska výkonu, čitelnosti a organizace je už spíše nasnadě to všechno narvat do jedny tabulky

 

Prostě to má klučina špatně. Kouknul jsem na funkci  AssignPlayerData a jsem toho názoru, že UNION bude zbytečně složitý, protože pokud bude mít  správně vytvořený dotaz s UNION, tak budou výsledkem dotazu 3 řádky, které bude muset ještě pomocí GROUP BY sloučit do jednoho. Takže bych rozhodně volil buď sloučení tabulek a nebo JOIN.

 

Já mám třeba tenhle dotaz, kde JOIN nepomůže, protože se v každém selectu může přihodit, že tam prostě nejsou data pro dané ShipmentID.  Ale už jsme celkem daleko od hlavního tématu. :D

SELECT
 sub.EventID
 ,sub.[MasterID]
 ,sub.[ObjectID]
 ,sub.[ObjectName]
 ,sub.[Activity]
 ,sub.[Description]
 ,sub.[EventTime]
 ,sub.ShipmentID
 ,sub.StopID
 ,sub.latitude
 ,sub.longitude

 FROM(

--SendHeartbeat
SELECT 
 EventID
 ,e.[MasterID]
 ,e.[ObjectID]
 ,e.[ObjectName]
 ,e.[Activity]
 ,e.[Description]
 ,e.[EventTime]
 ,t.c.value('shipmentId[1]', 'INT') as ShipmentID
 ,t.c.value('stopId[1]', 'INT') as StopID
 ,t.c.value('latitude[1]', 'NVARCHAR(15)') as latitude
 ,t.c.value('longitude[1]', 'NVARCHAR(15)') as longitude
 FROM [xrays].[system].[Events] e
 OUTER APPLY e.AdditionalData.nodes('SendHeartbeatRequest') as t(c)
 WHERE e.Activity = 'SendHeartbeat' and e.InsertionDT >= '2020-11-10 00:00'

UNION ALL
--UpdateOrder
SELECT 
	EventID
	,e.[MasterID]
	,e.[ObjectID]
	,e.[ObjectName]
	,e.[Activity]
	,e.[Description]
	,e.[EventTime]
	,t.c.value('shipmentId[1]', 'INT') as ShipmentID
	,t.c.value('stopId[1]', 'INT') as StopID
	,t.c.value('latitude[1]', 'NVARCHAR(15)') as latitude
	,t.c.value('longitude[1]', 'NVARCHAR(15)') as longitude
	FROM [xrays].[system].[Events] e
	OUTER APPLY e.AdditionalData.nodes('orderUpdate') as t(c)
	WHERE e.Activity = 'UpdateOrder' and e.InsertionDT >= '2020-11-10 00:00'

UNION ALL
--UpdateShipment
SELECT 
	EventID
	,e.[MasterID]
	,e.[ObjectID]
	,e.[ObjectName]
	,e.[Activity]
	,e.[Description]
	,e.[EventTime]
	,t.c.value('shipmentId[1]', 'INT') as ShipmentID
	,t.c.value('stopId[1]', 'INT') as StopID
	,t.c.value('latitude[1]', 'NVARCHAR(15)') as latitude
	,t.c.value('longitude[1]', 'NVARCHAR(15)') as longitude
	FROM [xrays].[system].[Events] e
	OUTER APPLY e.AdditionalData.nodes('shipmentUpdate') as t(c)
	WHERE e.Activity = 'UpdateShipment' and e.InsertionDT >= '2020-11-10 00:00'

UNION ALL


SELECT 
	EventID
	,e.[MasterID]
	,e.[ObjectID]
	,e.[ObjectName]
	,e.[Activity]
	,e.[Description]
	,e.[EventTime]
	,t.c.value('shipmentId[1]', 'INT') as ShipmentID
	,t.c.value('stopId[1]', 'INT') as StopID
	,t.c.value('latitude[1]', 'NVARCHAR(15)') as latitude
	,t.c.value('longitude[1]', 'NVARCHAR(15)') as longitude
	FROM [xrays].[system].[Events] e
	OUTER APPLY e.AdditionalData.nodes('StopUpdateRequest') as t(c)
	WHERE e.Activity = 'UpdateStop' and e.Description like 'myTruck status%' and e.InsertionDT >= '2020-11-10 00:00'

) sub
WHERE sub.ShipmentID=231726
ORDER BY sub.EventID desc

PS: Sloupec AdditionalData obsahuje XML, ze kterého se tahají data.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...