[php/mysql]joins op 3 tabellen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 09-09 13:03
Goedenavond,

Op dit moment zit ik al enige tijd te rommelen met joins. Ik heb een bestaande webshop met een bestaand backend systeem en mysql db. Hiervan wil ik het front-end gedeelte zelf gaan bouwen, hiermee denken wij een grotere site usebility te bereiken.

Dit is ook gelijk de reden dat ik weinig tot niks kan veranderen aan de DB structuur. Nu heb ik om het hoofdmenu te generen drie velden nodig.

catalog_category_entity (bepaald de volgorde e.d.)
catalog_category_entity_int (bepaald of een item wel of niet zichtbaar is)
catalog_category_entity_varchar (de menu naam en seo url)

Nu is het zo dat de waarde die ik wil hebben vanuit catalog_category_entity_int en catalog_category_entity_varchar beide in een cel staan varchar

Onderstaande query heb ik geschreven
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$_top_menu=mysql_query("SELECT * FROM catalog_category_entity
                                INNER JOIN catalog_category_entity_int
                                ON catalog_category_entity.entity_id = catalog_category_entity_int.entity_id
                                INNER JOIN catalog_category_entity_varchar
                                ON catalog_category_entity.entity_id = catalog_category_entity_varchar.entity_id
                                WHERE catalog_category_entity_int.attribute_id = '119'
                                AND catalog_category_entity_varchar.attribute_id = '111'
                                AND catalog_category_entity.parent_id = '$parent_id'
                                ORDER BY catalog_category_entity.position")or die(mysql_error());
        while($row=mysql_fetch_array($_top_menu)) {
            print $row['value']. '' . $row['value'] . '<br>';
        }


Nu schrijft de een waarde zichzelf dus over. Kun je misschien op een specifiek manier de database er bij vernoemen bijvoorbeeld.
$row->catalog_category_entity_varchar['value']
$row->['catalog_category_entity_varchar.value']

Of moet ik een van de twee waardes in een aparte query zetten.

Acties:
  • 0 Henk 'm!

  • MAX3400
  • Registratie: Mei 2003
  • Laatst online: 17:31

MAX3400

XBL: OctagonQontrol

Iets als
code:
1
SELECT table1.column1, table2.column2 FROM table1, table2 WHERE table1.column1 = table2.column1

Of begrijp ik je vraag nu totaaal verkeerd? Bovenstaande is trouwens een "default" SQL-statement; geen idee hoe dat binnen MySQL tot zijn recht komt.

Mijn advertenties!!! | Mijn antwoorden zijn vaak niet snowflake-proof


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
MAX3400 schreef op zaterdag 08 mei 2010 @ 23:15:
Iets als
code:
1
SELECT table1.column1, table2.column2 FROM table1, table2 WHERE table1.column1 = table2.column1

Of begrijp ik je vraag nu totaaal verkeerd? Bovenstaande is trouwens een "default" SQL-statement; geen idee hoe dat binnen MySQL tot zijn recht komt.
Veel minder elegant en geen oplossing. Leesvoer voor jou: http://www.86db1.com/sql-join-syntax-theta-vs-ansi

TS zoekt 'SELECT tbl1.varchar AS leukenaam FROM ..'.

Acties:
  • 0 Henk 'm!

  • L01
  • Registratie: December 2003
  • Laatst online: 12-09 11:29

L01

Meer zoiets dus
code:
1
SELECT tablename.varchar AS name, * FROM etc..

[ Voor 5% gewijzigd door L01 op 08-05-2010 23:31 ]

Hi, I'm a signature virus. Put me in your signature to help me spread.


Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 09-09 13:03
thanks,

Ik heb het nu werkend op onderstaande manier
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
        $_top_menu=mysql_query("SELECT * ,catalog_category_entity_int.value AS visible FROM catalog_category_entity
                                INNER JOIN catalog_category_entity_int
                                ON catalog_category_entity.entity_id = catalog_category_entity_int.entity_id
                                INNER JOIN catalog_category_entity_varchar
                                ON catalog_category_entity.entity_id = catalog_category_entity_varchar.entity_id
                                WHERE catalog_category_entity_int.attribute_id = '119'
                                AND catalog_category_entity_varchar.attribute_id = '111'
                                AND catalog_category_entity.parent_id = '$parent_id'
                                ORDER BY catalog_category_entity.position")or die(mysql_error());
        while($row=mysql_fetch_array($_top_menu)) {
            print $row['visible']. ' ' . $row['value'] . '<br>';
        }

Acties:
  • 0 Henk 'm!

  • josvane
  • Registratie: Oktober 2002
  • Laatst online: 09-09 13:03
Nog een vervolg vraag, is het ook mogelijk om binnen deze query nog een keer het veld catalog_category_entity_varchar te raadplegen.

Graag wil ik nog een waarde hieruit ophalen alleen met een ander attribute_id.

Of is dit alleen op te lossen met een aparte query.

Acties:
  • 0 Henk 'm!

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 11-09 23:46
Je kunt toch gewoon nog een innner join op dezelfde tabel doen met dat andere attribute id en dan m een naampje geven zoals AS ander_attribute_id?

/edit Wat hieronder ook gezegd wordt, ik drukte me wat spartaans uit :X

[ Voor 20% gewijzigd door _eXistenZ_ op 09-05-2010 14:54 ]

There is no replacement for displacement!


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 11-09 13:55
Allereerst 2 tips;
Alias je tabellen bij dergelijke tabelnamen. Dat scheelt nogal in leesbaarheid en overzichtelijkheid.
En mijd 'SELECT *'. Kan me niet voorstellen dat je alle kolommen uit deze 3 tabellen nodig hebt. Dan is het ook zonde om de ruimte van je query-cache daarvoor te gebruiken.

Door je clausules te plaatsen waar je ze nodig hebt, zou je ook direct zien dat een 2de attribuut ophalen eenvoudig kan met een extra join;
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT
    e.*,
    eiVisible.value AS visible,
    evNaam.value AS naam,
    evEmail.value AS email
FROM catalog_category_entity AS e
INNER JOIN catalog_category_entity_int AS eiVisible ON 
    eiVisible.entity_id = e.entity_id 
    AND eiVisible.attribute_id = 119
INNER JOIN catalog_category_entity_varchar AS evNaam ON 
    evNaam.entity_id = e.entity_id 
    AND evNaam.attribute_id = 111
INNER JOIN catalog_category_entity_varchar AS evEmail ON
    evEmail.entity_id = e.entity_id 
    AND evEmail.attribute_id = 112
WHERE e.parent_id = ?
ORDER BY e.position

[ Voor 3% gewijzigd door frickY op 09-05-2010 12:47 ]

Pagina: 1