[MySQL] Twee left joins in query probleem

Pagina: 1
Acties:

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
mysql> select t1.name, t2.count, t3.name as black_list from hal_index as t1 left join xtr_index as t2 using (name) left join xla_black_list as t3 using (name) where address = -1040468645 order by name;
+-----------+-------+------------+
| name      | count | black_list |
+-----------+-------+------------+
| a11e2win  |  NULL | NULL       |
+-----------+-------+------------+
mysql> select * from xla_black_list where name = "a11e2win";
+----------+--------------------+----------------+
| name     | comments           | last_modified  |
+----------+--------------------+----------------+
| a11e2win | Reconnection error | 20011214085513 |
+----------+--------------------+----------------+

Het probleem is dat de eerste query in de kolom black_list NULL geeft, terwijl dat a11e2win zou moeten zijn.
Maar waar in de query gaat het fout?

  • thijsc
  • Registratie: Augustus 2000
  • Laatst online: 22-12-2023
Zet anders de query even wat leesbaarder neer...

Wat enters erin enz.

  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Op donderdag 10 januari 2002 16:14 bedoelde OlafvdSpek het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
mysql> select t1.name, t2.count, t3.name as black_list from hal_index as t1 left join xtr_index as t2 using (name) left join xla_black_list as t3 using (name) where address = -1040468645 order by name;
+-----------+-------+------------+
| name  | count | black_list |
+-----------+-------+------------+
| a11e2win  |  NULL | NULL   |
+-----------+-------+------------+
mysql> select * from xla_black_list where name = "a11e2win";
+----------+--------------------+----------------+
| name     | comments        | last_modified  |
+----------+--------------------+----------------+
| a11e2win | Reconnection error | 20011214085513 |
+----------+--------------------+----------------+
De query, maar met enters:
code:
1
2
3
4
5
6
7
select t1.name, t2.count, t3.name as black_list 
from 
  hal_index as t1 
    left join xtr_index as t2 using (name) 
    left join xla_black_list as t3 using (name) 
where address = -1040468645 
order by name

De query, maar nu leesbaar:
code:
1
2
3
4
5
6
7
SELECT hal_index.name, xtr_index.count, xla_black_list.name as black_list 
FROM
  hal_index 
    LEFT JOIN xtr_index USING (name) 
    LEFT JOIN xla_black_list USING (name) 
WHERE address = -1040468645 
ORDER BY name

Leesbare code is de eerste stap naar een oplossing.
Aangezien ik absoluut niet snap wat je wilt, kan ik het antwoord niet geven...

Localhost, sweet localhost


  • kvdveer
  • Registratie: November 2000
  • Laatst online: 06-11-2025

kvdveer

Z.O.Z.

Nog even kijkend:
Ik denk niet dat je begrijpt wat je wilt...

Je hebt in 3 tabellen (hal_index,xtr_index,xla_black_list) met alledrie een Key name.

Je joint hal_index en xtr_index, zodat alle rijen van hal_index worden geretourneerd, en alleen de rijen xtr_index waarvoor name gelijk is aan hal_index.
Dat levert blijkbaar een NULL waarde op.

DAAROP join je de tabel black_list...


Die syntax met USING is erg onduidelijk. Probeer het eens gewoon met een JOIN ... ON ...
code:
1
2
3
4
5
6
7
SELECT hal_index.name, xtr_index.count, xla_black_list.name as black_list 
FROM
  hal_index 
    LEFT JOIN xtr_index ON (hal_index.name = xtr_index.name)
    LEFT JOIN xla_black_list ON (xtr_index.name = xla_black_list.name) 
WHERE address = -1040468645 
ORDER BY name

of bedoel je:
code:
1
2
3
4
5
6
7
SELECT hal_index.name, xtr_index.count, xla_black_list.name as black_list 
FROM
  hal_index 
    LEFT JOIN xtr_index ON (hal_index.name = xtr_index.name)
    LEFT JOIN xla_black_list ON (hal_index.name = xla_black_list.name) 
WHERE address = -1040468645 
ORDER BY name

Localhost, sweet localhost


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik begrijp wel wat ik wil, maar waarschijnlijk niet hoe dat er als een SQL query uitziet. De bedoeling is die laatste query inderdaad. Ik denk dat SQL nu de rechter join eerst uitvoert in plaats van de linker join.

  • OxiMoron
  • Registratie: November 2001
  • Laatst online: 27-06 10:54
Je kunt het met subquery's proberen.
code:
1
2
3
SELECT *
FROM tabel
WHERE colomnaam in (SELECT colomnaam FROM tabel)

Of misschien een view maken, als MySQL dat ondersteund tenminste.

Albert Einstein: A question that sometime drives me hazy: Am I or are the others crazy?


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
Ik denk dat MySQL geen van beide ondersteund en ik denk ook niet dat het resultaat is wat ik verwacht. Die join werkt nu goed.
Pagina: 1