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

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