Avatar billede nemlig Professor
15. juni 2017 - 22:59 Der er 5 kommentarer og
1 løsning

LEFT JOIN driller

Hejsa.
Jeg har 2 tabeller:
- `rejser_kunder` (navneoplysninger mm)
- `rejser_tur` (oplysninger om tur)

Jeg ønsker at liste alle poster i tabellen `rejser_kunder` og samtidig vise datoerne fra tabellen `rejser_tur`

SELECT k.*, t.afgang, t.hjemkomst FROM `rejser_kunder` k LEFT JOIN `rejser_tur` t ON k.tur_nr = t.turnr

Jeg tjekker op på felterne:
k.tur_nr = t.turnr

Min SELECT giver 2 x den samme post fra `rejser_kunder`, når fx. k.tur_nr = 17
og hvis der i tabellen `rejser_tur`er 2 poster, hvor den ene har  t.turnr = "17" og  den anden "17-1".
Felterne er af typen varchar(255).

Hvorfor kommer den anden post med? Den skal jo kun komme, når 17=17 og ikke når 17=17-1.
Avatar billede nemlig Professor
15. juni 2017 - 23:08 #1
Ups - har lige opdaget at feltet k.tur_nr er af typen int(4), mens t.turnr er af typen varchar(). Det tror jeg er problemet.
Avatar billede nemlig Professor
15. juni 2017 - 23:30 #2
OK - så virker det, da jeg fik rette datatypen.
Avatar billede arne_v Ekspert
16. juni 2017 - 05:23 #3
MySQL har en noget suspekt type sikkerhed.

Demo:


mysql> select 17=17-1;
+---------+
| 17=17-1 |
+---------+
|      0 |
+---------+
1 row in set (0.02 sec)

mysql> select 17='17-1';
+-----------+
| 17='17-1' |
+-----------+
|        1 |
+-----------+
1 row in set, 1 warning (0.00 sec)
Avatar billede Slater Ekspert
16. juni 2017 - 07:15 #4
#3: Damn, det er jo ikke engang bare et problem med typesikkerhed, det er også forkert i svage typer. Tallet 17 er ikke lig med strengen et-syv-dash-et på nogen som helst måde.
Avatar billede arne_v Ekspert
16. juni 2017 - 14:39 #5
Det MySQL goer er at den tager det foerste valide tal i strengen og konverterer det til int og ignorerer resten. Og nul er default hvis der intet tal er.


mysql> select 0+'123';
+---------+
| 0+'123' |
+---------+
|    123 |
+---------+
1 row in set (0.03 sec)

mysql> select 0+'123+456';
+-------------+
| 0+'123+456' |
+-------------+
|        123 |
+-------------+
1 row in set, 1 warning (0.00 sec)

mysql> select 0+'123 this is absurd';
+-------------------------+
| 0+'123 this is absurd' |
+-------------------------+
|                    123 |
+-------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> select 0+'This is absurd';
+---------------------+
| 0+'This is absurd' |
+---------------------+
|                  0 |
+---------------------+
1 row in set, 1 warning (0.00 sec)
Avatar billede nemlig Professor
16. juni 2017 - 19:19 #6
Tak Arne. Det var meget oplysende :)
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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