Autor Zpráva
quatzael
Profil
Dotaz 1:
Jak docílit toho, abych měl data z více tabulek rozdělené do asociativního pole, aby se nemíchaly sloupce se stejným názvem?

 SELECT * 
 FROM contracts

 JOIN products ON products.contract_id = contracts.id
 JOIN items ON items.contract_id = contracts.id

 WHERE contracts.user_id = 32

Potřeboval bych, abych dostal výsledek do asociativního pole, pro případ, že by ve všech třech tabulkách (contracts, products, items) byl sloupec s názvem "name":
$result['contracts']['name'] ..... vrací hodnotu sloupce "name" z tabulky contracts
$result['products']['name'] ..... vrací hodnotu sloupce "name" z tabulky products
$result['items']['name'] ..... vrací hodnotu sloupce "name" z tabulky items

Dotaz 2:
Jak docílit toho, abych dostal více záznamů, které vyhovují podmínce JOIN, z tabulky items, která bude mít více řádků s odpovídající hodnotou contract_id, do pole takto:

 SELECT * 
 FROM contracts

 JOIN items ON items.contract_id = contracts.id

 WHERE contracts.user_id = 32

$result['items'][0]['name'] ..... vrací hodnotu sloupce "name" z tabulky items z prvního řádku
$result['items'][1]['name'] ..... vrací hodnotu sloupce "name" z tabulky items z druhého řádku
Keeehi
Profil
quatzael:
Vícerozměrné pole z toho nijak automaticky nedostaneš. Aby se ti sloupce nejmenovaly stejně, tak si je můžeš pojmenovat.

SELECT contracts.id `contracts.id`, contracts.name `contracts.name`, products.contract_id `products.contract_id`, products.name `products.name`, items.contract_id `items.contract_id`, items.name `items.name`
FROM contracts
JOIN products ON products.contract_id = contracts.id
JOIN items ON items.contract_id = contracts.id
WHERE contracts.user_id = 32

Výsledkem bude zase jednorozměné pole, ale tentokrát i se jmény tabulek.
$result['contracts.name']
Což není tak daleko od toho co jsi původně chtěl a mohlo by ti to stačit. Pokud trváš na tom vícerozměrném poli, budeš si to muset do něho transformovat. Což mě osobně přijde jako zbytečné plýtvání výkonem.

Ještě úvaha nad pozicí indexu v $result['items'][0]['name']
$result[0]['items']['name'] - na začátku by dával smysl při joinu tabulek.
$result['items'][0]['name'] - uprostřed by dával smysl pokud by se vybíraly data jen z tabulky items, pak by to ale mělo vypadat $result[0]['name']
$result['items']['name'][0] - na konci to nemá smysl už vůbec, pole nepředstavují řádky ale sloupce, data mají ale souvislost v řádku a ne ve sloupci.

Jediné správné řešení mi tedy přijde $result[0]['items.name']. Proč? No protože když si zkusíš data vypsat do tabulky, tak v tomto pořadí to krásně půjde s foreach. Při obráceném pořadí $result['items.name'][0] to nijak nepůjde, jelikož by se data procházela po sloupcích ale ty je potřebuješ po řádcích.
quatzael
Profil
Keeehi:
Díky za odpověď. Nejde nějak ty sloupce pojmenovat skupinově? Já jich tam mám v každý tabulce několik desítek, to bych se upsal.. Navíc nějaký úpravy s tabulkou pak budou strašně težkopádný..

K tomu dotazu č. 2:
Možná jsem nedal nejlepší příklad. Tady je vhodnější:
V jedné tabulce budu mít autory a v další knížky, které napsali. Tzn., že k jednomu autorovi patří třeba 7 knih, k dalšímu 4 a k nějakému třeba žádná. Jak tedy udělat, abych získal pole, abych mohl pomocí cyklu while vypsat všechny autory a uvnitř toho cyklu použít další cyklus while na ty knížky?

Teď jsem to napsal myslím celkem srozumitelně..
Keeehi
Profil
2 Nejčastější potíže s PHP (FAQ) » Nadpis skupiny nejen při výpisu z databáze
TomášK
Profil
mysqli_fetch_fields vrátí informace o polích v dotazu, mimo jiné název a z jaké tabulky pocházejí. Přidej k tomu trochu práce s poli a dostaneš výsledek, který chceš v 1). Nechceš použít hotové řešení (klíčové slovo ORM) než tvořit vlastní?
quatzael
Profil
TomášK:
Koukal jsem na ORM, ale připadá mi to spíš jako přístup k programování než skutečné "hotové řešení".
Keeehi
Profil
quatzael:
ORM samozřejmě koncept je. A pak existují projekty, který tento koncept implementují. Jako je třeba Doctrine 2. Pokud využíváš nějaký framework, nejspíše nějaké ORM mít implementované bude, nebo pro něj bude existovat nějaké rozšíření.
quatzael
Profil
Keeehi:
No, teď to teda budu muset vyřešit podle tohoto: [#4] Keeehi, protože kvůli několika dotazům do databáze nebudu všechno předělávat. Do budoucna se chci naučit Symfony 2, ale zdá se mi to strašně složitý udělat ten první krok. Vůbec všechny PHP frameworky mi připadají strašně nesrozumitelný. Nedá se nikde dočíst co fakticky "umí" a implementace je nesmírně náročná.. :o(
Alphard
Profil
Jako je třeba Doctrine 2.
Ehm, to je hned přístup s dělem na komára.
Dokud se tady bavíme čistě o selectech, mohlo by stačit třeba Nette\Database. Požadavek z [#3] by zvládlo v pohodě.

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: