[php/mysql] JOIN met identieke column names

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ajakkes
  • Registratie: Maart 2004
  • Laatst online: 16-05 22:32
SQL:
1
2
3
4
5
SELECT *    FROM tableA 
INNER JOIN tableB ON tableA.ID = tableB.tableA_ID
INNER JOIN tableC ON tableB.ID = tableC.tableB_ID
INNER JOIN tableD ON tableC.ID = tableD.tableC_ID
WHERE tableD.ID=1


Het resultaat van deze query is ID - name - ID - tableA_ID - name - ID - tableB_ID - name - ID - tableC_ID - name

Naast nog allerlei andere data die uit de tabellen komt.

Nu zou ik graag willen dat alles wat uit tableA komt het label tableA.* krijgt. dus tableA.ID - tableA.name tableB.ID e.d.

Ik heb zoiets gevonden als SELECT tableA.ID AS tableA_ID maar dan moet ik elke kolom zelf gaan hernoemen.

Kan ik dit door MySQL zelf laten doen?

[ Voor 3% gewijzigd door MueR op 14-09-2010 14:57 ]

👑


Acties:
  • 0 Henk 'm!

  • MueR
  • Registratie: Januari 2004
  • Laatst online: 14:53

MueR

Admin Tweakers Discord

is niet lief

Je kan beginnen door geen SELECT * te doen. Vaak heb je lang niet alle velden nodig uit al die tabellen, daarbij heb je dit probleem. Kijk eens naar het AS keyword.

Anyone who gets in between me and my morning coffee should be insecure.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
MueR schreef op dinsdag 14 september 2010 @ 14:57:
Je kan beginnen door geen SELECT * te doen.
Inderdaad.
Dat had 'ie al ontdekt ;)
ajakkes schreef op dinsdag 14 september 2010 @ 14:53:
Ik heb zoiets gevonden als SELECT tableA.ID AS tableA_ID maar dan moet ik elke kolom zelf gaan hernoemen.
Kan ik dit door MySQL zelf laten doen?
Nee, en waarom zou je dat willen? Moet MySQL dan maar namen uit z'n duim gaan zuigen?

[ Voor 74% gewijzigd door RobIII op 14-09-2010 14:58 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Sowieso zullen het geen honderden kolommen in dezelfde resultset gaan zijn, dus zo'n groot probleem mag dat niet opleveren. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • NL-RaVeR
  • Registratie: Oktober 2007
  • Laatst online: 19-09 14:49
Je bedoelt dus iets al: SELECT klanten.naam as naam_van_klant, bedrijven.naam as naam_van_bedrijf from klanten, bedrijven where ...........

Dus gewoon "AS" gebruiken en je kan de columns je eigen naam geven hoe ze teruggegeven worden ;)

Acties:
  • 0 Henk 'm!

  • stappel_
  • Registratie: Augustus 2000
  • Laatst online: 20:41
Een "parel" uit een oud stuk code van een voorganger dat we nog steeds elke dag tegen komen.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
        $result = mysql_query($query) or log_sql_error($query);

        if ($result !== false)
        {
            // kolom namen bepalen
            $numfields = mysql_num_fields($result);
            $fields = Array();
            for ($cnt=0; $cnt < $numfields; $cnt++)
            {
                $field = mysql_fetch_field($result, $cnt);
                $fields[$cnt] = $field->table . '.' . $field->name;
            }

            while ($row = mysql_fetch_row($result))
            {
                // data ophalen
                $data = Array();
                for ($cnt=0; $cnt < $numfields; $cnt++)
                {
                    $data[$fields[$cnt]] = $row[$cnt];
                }
                // $data['tabelnaam'.'kolomnaam']
            }
        }

geheel dynamich op basis van de query.

Ubero: #2, Euler: #1, GOT: #1, Des: #1, Zeta: #1, Eon: #3, OGR-24: #3, OGR-25: #7,
LM: #7, AP: #5, DF: #19, D2OL: #37, SOB: #50, TSC: #63, RC5: #96


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Geef de TS een brakke oplossing, goed bezig :{ Gewoon zelf je kolommen benoemen in de query en je hebt nergens problemen mee, dynamischer kunnen we t niet maken ook :)

Acties:
  • 0 Henk 'm!

  • ajakkes
  • Registratie: Maart 2004
  • Laatst online: 16-05 22:32
SQL:
1
2
3
4
5
6
7
8
9
10
    
    SELECT    tableA.name AS tableA_name, 
            tableB.name AS tableB_name, 
            tableC.name AS tableC_name, 
            tableD.name AS tableD_name 
    FROM tableA 
    INNER JOIN tableB ON tableA.ID = tableB.tableA_ID 
    INNER JOIN tableC ON tableB.ID = tableC.tableB_ID 
    INNER JOIN tableD ON tableC.ID = tableD.tableC_ID 
    WHERE tableD.ID=1;


Dus gewoon zo.

Zo had ik het zelf inmiddels ook al opgelost maar ik vroeg me af of MySQL hier iets voor had. En nee, niet zelf verzinnen maar de kolomnaam door de tabelnaam vooraf laten gaan.

In ieder geval bedankt voor de bevestiging.

[ Voor 2% gewijzigd door ajakkes op 14-09-2010 15:57 . Reden: Ik zie MueR's edit nu. Even code SQL van gemaakt ]

👑


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Wat ik zelf ook doe is voor velden waarvan je weet dat je ze in joins vaak nodig hebt (dus juist een veld als "name", "title" of "description") een prefix toevoegen. Dus voor de tabel "Page" heb ik een veld "PageTitle". Dan heb ik niet zo vaak een alias nodig en in een query waarvan ik weet dat die te allen tijde vrij licht zal zijn (een menu genereren uit diezelfde Page-tabel bijvoorbeeld) kan ik zelfs SELECT * gebruiken. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • ajakkes
  • Registratie: Maart 2004
  • Laatst online: 16-05 22:32
Ja, daar ga ik de volgende keer ook over nadenken als ik de tabel creëer.

👑


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

ajakkes schreef op dinsdag 14 september 2010 @ 15:51:
Zo had ik het zelf inmiddels ook al opgelost maar ik vroeg me af of MySQL hier iets voor had. En nee, niet zelf verzinnen maar de kolomnaam door de tabelnaam vooraf laten gaan.
Om eerlijk te zijn zit het probleem helemaal niet in mysql, maar eerder in php. Mysql geeft gewoon een nette resultset terug, maar omdat php het in een map gooit met alleen de kolomnamen worden de dubbele waarden overschreven. Doe maar eens een mysql_fetch_row en doe daar een dump van. Dan zie je dat alles er gewoon netjes in zit.

Ikzelf ben niet zo'n voorstander van de oplossing van NMe.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

Verwijderd

Wat sowieso een goed idee is is om je ID-kolommen wel een prefix te geven: tablea_id, tableb_id. Op die manier kun je in je JOIN's USING() gebruiken. Dan zou je desnoods je andere kolommen ook kunnen prefixen maar dat is je eigen keuze. Een ID gebruik je namelijk vaak door de hele database heen terwijl de overige data wel strikt bij die tabel hoort. Ik weet niet hoe logisch het klinkt maar ik ben ook niet fantastisch goed in uitleggen.

Anyway, stel dat je je ID-kolommen prefixt, dan hoef je alleen de rest te aliassen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
  tableA_id,
  tableA.name AS name_a
  tableB_id,
  tableB.name AS name_b
  tableC_id,
  tableC.name AS name_c
  tableD_id,
  tableD.name AS name_d
FROM tableA
  JOIN tableB USING(tableA_id)
  JOIN tableC USING(tableB_id)
  JOIN tableD USING(tableC_id)
WHERE tableD_id = 1

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Ik vind prefixen ook geen oplossing, eerder een workaround omdat je te lui bent om 'AS' te gebruiken.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Cartman! schreef op dinsdag 14 september 2010 @ 22:25:
Ik vind prefixen ook geen oplossing, eerder een workaround omdat je te lui bent om 'AS' te gebruiken.
Precies. Gewoon aliassen et voila. Zo moeilijk is het niet.

[ Voor 8% gewijzigd door RobIII op 14-09-2010 22:35 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Het is niet moeilijk, wel vervelend. En voor beide argumenten is wat te zeggen; ik zeg dan ook niet dat iemand zijn velden maar moet hernoemen, ik zeg dat het de manier is waarop ik zelf prettig kan werken. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 21-09 02:21

Janoz

Moderator Devschuur®

!litemod

Ik vind het juist handiger wanneer ik er overal van uit kan gaan dat de PK altijd 'ID' heet ipv dat ik USING kan gebruiken.

Maar uiteindelijk is het allerbelangrijkste dat je (voor je project) er 1 kiest en daar dan ook bij blijft.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'

Pagina: 1