Sziasztok!
Olyan problémám lenne, hogy egy adatbázis x táblájának oszlopaival kellene műveletet végeznem. Az oszlopok száma ebből a szempontból ismeretlen, az information schema adja... Külföldi oldalakon nem jártam sikerrel, mindenki mindenféle tárolt eljárásos megoldással próbál előhozakodni. egy halvány példa mire is gondolok:
A tábla és oszlopneveket megkapom a
SELECT TABLE_NAME, COLUMN_NAME FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA=DATABASE();
lekérdezésből. azt szeretném, ha ezen eredmények mindegyikén végigmenne az sql és egy másik query-t lefuttatna, mint mondjuk a
SELECT MAX(COLUMN_NAME) from TABLE_NAME;
ahol COLUMN_NAME és TABLE_NAME az első eredményhalmaz adott sorából jön...
már próbáltam kismillió változatot...
Valami ötlet, hátha volt hasonlóra szüksége valakinek...
Köszönöm!
- 5178 megtekintés
Hozzászólások
A MAX() függvényt nem teljesen értem miért jó neked, különösen szöveg jellegű eredményekkel.
--
Apache Solr Druplahoz és Wordpresshez: http://solr.vpspro.hu
- A hozzászóláshoz be kell jelentkezni
Ez csak egy példa lett volna. de mondjuk a LENGTH() már működik, vagy akár a CONCAT() is. Csak az értelmezés kedvéért választottam.
- A hozzászóláshoz be kell jelentkezni
Neked subquery kell:
SELECT LENGTH(TABLE_NAME), LENGTH(COLUMN_NAME) FROM (SELECT TABLE_NAME, COLUMN_NAME FROM information_schema.`COLUMNS` C WHERE TABLE_SCHEMA=DATABASE()) AS tmptable;
- A hozzászóláshoz be kell jelentkezni
Köszi, ezzel sajnos az a baj, hogy ha a tábla neve mondjuk users, és áll a tábla uid, name és psw mezőkből, hogy egyszerű legyen a példa,és tartalmaz mondjuk 2 adatsort:
uid name psw
1 Kis Pista 12345
2 Nagy Jocó 67890
akkor a Te queryd eredménye az lesz, hogy:
LENGTH(TABLE_NAME) LENGTH(COLUMN_NAME)
5 3
5 4
5 3
mert az oszlop nevét veszi. Ezért gondoltam a MAX() fv-t példának, hogy az adott oszlop értékeit nézi. Tehát mondjuk a COLUMN_NAME MAX(COLUMN_NAME) azt hozza erre, hogy:
uid 2
name (itt sajnos nem értelmezhető, de egy más fv mondjuk ok)
psw 67890
- A hozzászóláshoz be kell jelentkezni
Akkor rosszul értettem. A schema csak a tábla tulajdonságait, pl. mezőnevét adja vissza. Itt ráadásul minden táblára vonatkozva.
Itt jön az, hogy én tökmáshogy csinálnám. Jó eséllyel be lehet valahogy oltani, hogy direktben az SQL adja vissza amit akarsz, de jobban jársz a hagyományos úttal imho.
SHOW TABLES FROM $database;
-- Na ide nyugodtan jöhet a foreach. :)
Kiválasztod az oszlopneveket minden táblából, akár info schemaból.
SELECT $oszlopneveklistaja FROM table;
-- Örül.
- A hozzászóláshoz be kell jelentkezni
igen, ez az egyszerűbbik út... De egyrészt szeretjük a kihívásokat, másrészt pedig ha az sql odaadná az eredményt, akkor minek pörgessem a php-t?
De köszönöm!
- A hozzászóláshoz be kell jelentkezni
Jelen esetben teljesen mind1 erőforrás szempontból, hogy a tárolt eljárással az SQL szervert pörgeted nagyjából hasonló algoritmus szerint, mint a PHP-t. Akkor jöhet jól a tárolt eljárás, ha az SQL szerver és a PHP szerver között extra nagy a válaszidő vagy extrém módon spórolni kell a forgalommal, lekérdezésekkel.
- A hozzászóláshoz be kell jelentkezni
miért baj a tárolt eljárás?
- A hozzászóláshoz be kell jelentkezni
Itt az idő elővenni a kedvenc shelledet, és 2 perc alatt összekonkatenálni a lekérdezett táblanevekből a lényegi SQL-t.
- A hozzászóláshoz be kell jelentkezni
A tákolt eljárásban ugyanezt igyekeznek megvalósítani imho :) De egyébként +1
-----------
"640GB sokmindenre elég"
- A hozzászóláshoz be kell jelentkezni
Nyilván, és ha nem egyszer kell, akkor mégis a teendő.
- A hozzászóláshoz be kell jelentkezni
PHP kapná meg a végeredményt. Persze a foreach sokmindenre megoldás, de piszkálja a csőrünket, hogy jobb lenne egyben kinyerni az eredményt...
- A hozzászóláshoz be kell jelentkezni
Neeeeeeeeeeeeeeeee... :) Mármint a foreach-et. Aki a MySQL-ből kinyert gigemega eredményhalmazra elsőre ráeresztette a foreach-et azzal szerintem néhányan innen elbeszélgetnénk. :) Van subselect, SQL-es rendező opciók, egy halom függvény, view-k stb. Igazán extra eset kell, hogy a PHP-ból kelljen komoly formában variálni.
- A hozzászóláshoz be kell jelentkezni
Egyetértek... nem tízezres nagyságrendű eredmény várható, hanem néhány tíz vagy max néhány száz... és nem feltétlenül szó szerinti foreach-et kell érteni, vannak jobb megoldások is. arra gondoltam, hogy ha lehet, akkor elkerülni, hogy minden tábla/oszlop lekérdezéséhez be kelljen szaladni sql-hez. Az egyik cél, hogy többek között kinyerjek egy
TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH halmazt az information_schema-ból, és minden oszlop mellé oda legyen írva a lekérdezéskori pillanatnyi maximális érték/hossz...
- A hozzászóláshoz be kell jelentkezni
Az SQL az azonosítókra nézve statikus.
Ezen segít valamelyest - ahol van - a PL-nek valamilyen megvalósítása, vagyis a tárolt eljárás/függvény.
- A hozzászóláshoz be kell jelentkezni
SET @s = CONCAT('INSERT INTO Results ', @Expression);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt; -- ha a session-t tovabb fogod hasznalni
- A hozzászóláshoz be kell jelentkezni