Avatar billede zurekk Nybegynder
02. september 2008 - 17:51 Der er 12 kommentarer og
1 løsning

Prefix på returnerede rækker.

Hej Eksperter,

Jeg leder efter en metode, hvormed jeg kan hente forskellige tabeller ud i samme forespørgsel, med hvert deres prefix.

En måde at gøre det på, er ved at give hver række et nyt navn, som her:
SELECT
table1.id as tbl1_id,
table1.title as tbl1_title,
table1.ip as tbl1_ip,
table2.id as tbl2_id,
table2.name as tbl2_name
FROM
table1
JOIN
table2
  ON
  table2.id = table1.row

Men det kan hurtigt gå hen og blive noget rod, når tabellerne har mere end et par rækker.

Er der en lettere måde at gøre det på?

På forhånd tak!
Avatar billede zurekk Nybegynder
02. september 2008 - 23:06 #1
Ingen?

Lader det stå til i morgen.
Avatar billede arne_v Ekspert
03. september 2008 - 02:02 #2
Jeg tror ikke at der er nogen nemmere måde.
Avatar billede zurekk Nybegynder
03. september 2008 - 18:42 #3
arne_v ->

Det har jeg altså svært ved at tro. Der må være en måde, hvorpå du kan hente flere tabeller ud, uden at skulle omdøbe alle rækkerne.

Jeg lader det stå lidt endnu.
Avatar billede arne_v Ekspert
03. september 2008 - 18:52 #4
De fleste henter kolonne paa index fremfor navn eller bruger kolonnenavne som ikke
konflikter.

Det bedste du kan goere er nok at skrive en lille funktion som modificerer dine
SQL queries inden de udfoeres.
Avatar billede zurekk Nybegynder
03. september 2008 - 19:24 #5
arne_v -> "De fleste henter kolonne paa index fremfor navn eller bruger kolonnenavne som ikke konflikter."
- Jeg er ikke med?

"Det bedste du kan goere er nok at skrive en lille funktion som modificerer dine
SQL queries inden de udfoeres."
- Det tror jeg bliver noget rod, medmindre du har noget specielt i tankerne?
Avatar billede zurekk Nybegynder
03. september 2008 - 19:28 #6
arne_v ->
"eller bruger kolonnenavne som ikke konflikter."
- Det er svært når kolonnerne har det samme formål. Eksempelvis går "id" igen, i de fleste tabeller. "title", "desc", "otype", "oid", "date", er også brugt ofte.
Avatar billede arne_v Ekspert
04. september 2008 - 02:32 #7
DESC og DATE er meget dårlige feltnavne, da de er reserverede ord.

For at undgå den her slags problemer vælger man netop nogle ikke at bruge ffeltnavne som
id men i.s.f. fooid og barid.
Avatar billede arne_v Ekspert
04. september 2008 - 02:35 #8
Jeg tænker på en lille funktion som kan bruges som:

sqlstr = fixup("SELECT tbl1.id, tbl2.id, tbl1.navn, tbl2.navn FROM tbl1,tbl2 WHERE tbl1.id=tbl2.tbl1id");

hvor fixup så parser og modifieder SQL streng til at være:

"SELECT tbl1.id AS tbl1_id, tbl2.id AS tbl2_id, tbl1.navn AS tbl1_id, tbl2.navn AS tbl2_id FROM tbl1,tbl2 WHERE tbl1.id=tbl2.tbl1id"
Avatar billede zurekk Nybegynder
04. september 2008 - 16:48 #9
"DESC og DATE er meget dårlige feltnavne, da de er reserverede ord."
- Det har du også ret i, dem får jeg lige ændret.

"For at undgå den her slags problemer vælger man netop nogle ikke at bruge ffeltnavne som id men i.s.f. fooid og barid."
- Det går bare ikke her, da nogle kolonner har det samme formål, og det ville blive noget rod med forskellige navne.

"Jeg tænker på en lille funktion som kan bruges som:"
- Hvad med noget ala. dette:

function sqlcPrefix( $cols, $tbl, $prefix )
{
    if( !is_array( $cols ) ) return false;
   
    foreach( $cols as $col )
    {
        $result[] = sprintf( '%s.%s as %s_%2$s', $tbl, $col, $prefix );
    }
   
    return implode( ', ', (array) $result );
}

print sqlcPrefix( Array( 'id', 'title', 'text', 'date_submit' ), 'tbl1', 'obj' );

# tbl1.id as obj_id, tbl1.title as obj_title, tbl1.text as obj_text, tbl1.date_submit as obj_date_submit

Så kan jeg evt. lave en seperat fil med disse "kolonne-arrays", så jeg bare kalder "sqlcPrefix( $sqlc_tbl1['all'], 'tbl1', 'obj' );", for at få mine prefixed kolonner.

Er det noget som vil virke i længden? Er der noget jeg har overset?
Avatar billede zurekk Nybegynder
04. september 2008 - 17:08 #10
Du må desuden godt smide et svar :)
Avatar billede arne_v Ekspert
04. september 2008 - 20:07 #11
Mere noget a la:

<?php
function sqlfixup($sqlstr) {
    preg_match('/(SELECT )(.+?)( FROM .*)/', $sqlstr, $groups);
    $cols = explode(',', $groups[2]);
    for($i = 0; $i < count($cols); $i++) {
        $cols[$i] = $cols[$i] . ' AS ' . str_replace('.', '_', $cols[$i]);
    }
    return $groups[1] . implode(',', $cols) . $groups[3];
}

$sqlstr = 'SELECT tbl1.id, tbl2.id, tbl1.navn, tbl2.navn FROM tbl1,tbl2 WHERE tbl1.id=tbl2.tbl1id';
echo $sqlstr . "<br>\r\n";
$sqlstr = sqlfixup($sqlstr);
echo $sqlstr . "<br>\r\n";
?>
Avatar billede arne_v Ekspert
04. september 2008 - 20:07 #12
og et svar
Avatar billede zurekk Nybegynder
04. september 2008 - 20:28 #13
"Mere noget a la:"
- Ja, det ville virke, men sådan som min side er bygget op, passer den anden løsning bedre ind og er lettere at arbejde med.

Tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester