DB: Získávání dat z různých tabulek ze sloupců se stejnými názvy

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
darthcz
Člen | 113
+
0
-

Zdravím,

chtěl bych se zeptat ohledně získávání dat z databáze, a to konkrétně z různých tabulek s položkami se stejnými názvy.

Pokud se budu držet pojmenovávací konvence z http://ronaldbradford.com/…-2008-09-02/, kterou používám, jak pomocí php budu řešit získávání dat ve sloupcích se stejným názvem?

Např:

SELECT u.address, f.address FROM user u JOIN friend f ON u.user_id = f.user_id;

Tohle mi vrátí pouze adresu přítele. Mohl bych použít as, ale to neřeší problém, pokud to zapíši jako hvězdičky nebo je těch tabulek a dat daleko více nebo je tvorba dotazu dynamická.

SELECT u.*, f.* FROM user u JOIN friend f ON u.user_id = f.user_id;

Na hvězdičku by mnozí mohli namítnout, že to příliš zatěžuje databázi, ale do gridu je to třeba potřeba.

Jak to řešíte vy?

Za odpověď děkuji.

OK3
Člen | 91
+
0
-

Na téhle úrovni (SQL) nejspíš zbývá jen aliasovat sloupce u.address AS userAddress, f.address AS friendAddress.

Co se týče těch výběrů s hvězdičkou u.*, je potřeba sloupce vyjmenovat a aliasovat. Jestli se pletu, tak mě prosím opravte :)

Nebo si adresy vytáhnout dvěma dotazy a uložit do rozdílných proměnných, ale to už je jiné řešení.

Editoval OK3 (21. 8. 2012 16:14)

darthcz
Člen | 113
+
0
-

Popravdě mě děsí představa aliasování třeba 12 sloupců z jedné tabulky, 13 sloupců z další atd…

Jde mi o nejlepší řešení tohoto problému. Dva dotazy je samozřejmě taky možnost, ale asi ne moc čistá. Dva náročné dotazy s řadou joinů provádět jen pro výběr jiných dat nevím, zda je lepší řešení.

Další možností je jednoduše prefixovat všechny sloupce názvem tabulky, takže budou unikátní, ale to zase tak nějak odporuje pojmenovávací konvenci, kterou se snažím dodržovat, proto hledám nějaký nejlepší kompromis…

leninzprahy
Člen | 150
+
0
-

Ahoj,
přijde mi, že pokud máš dvě tabulky které mají 12 sloupců se stejným názvem, možná by stálo za to znovu rozmyslet návrh databáze (stejné sloupce vyčlenit do jedné tabulky atd.), protože je lepší mít víc tabulek s menším počtem sloupců než naopak.

Jinak mě krom aliasů, případně změny názvu sloupců, napadá snad jen napsání funkce která by aliasy generovala (napíšeš jen jednou a můžeš používat všude) ale také to není nejelegantnější řešení…

darthcz
Člen | 113
+
0
-

Nemají 12 sloupců se stejným názvem, ale potřebuješ je získat všechny, takže stačí jeden stejný a musíš je vypsat všechny, pokud se nemýlím. Nejsem si jistý, jestli lze napsat friends.*, friends.name as friendName … Každopádně to taky moc hezky nevypadá…

Většinou jde o to, že když chceš vypsat všechno ze 3 tabulek, tak nevíš, jestli jsou nějaké sloupce stejně pojmenované… Ani takový dotaz neskončí chybou, takže když ve výpisu přistupuješ k name, tak dostaneš pokaždé to samé… Navíc pokud by si generoval automaticky aliasy, jak bys věděl, který sloupec bude s aliasem a případně jakým? Bylo by to dynamické a tudíž do šablony špatně použitelné… Nevěděl bys v šabloně název sloupce…

marek.dusek
Člen | 99
+
0
-

Aliasovani se nevyhnes (zafixuj si to treba do pohledu, pokud to pouzivas casteji), kazdopadne pro „vetsi prekryvy“ (viz zminenych 12 sloupcu) je otazka, zda to nemit v extra db strukture, ze ktere se „vybere vice radku“.

PS: syntaxe „f.*, f.name AS friend_name“ je mozna

PS2: pouzivani „*“ se vyhni a sloupce si vypis explicitne – klidne do pohledu namisto php, ale nekde je mej

Editoval marek.dusek (22. 8. 2012 0:30)