Toon posts:

[MySql] Join probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb de volgende query:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$query = "
SELECT
 pm.pm_map_name,
 pm.pm_map_id,
 p.pm_id,
 p.pm_title,
 p.pm_u_from,
 p.pm_read,
 p.pm_timestap,
 u.u_id,
 u.u_nickname
FROM
 users AS u,
 pm AS p,
 pm_maps AS pm
WHERE
 p.pm_map_id_to = 2
AND
 pm.pm_map_id = p.pm_map_id_to
AND
 p.pm_u_to = 1
";


Als ik hier dan in een while print_r doe, krijg ik hetvolgende:
code:
1
2
3
4
Array ( [pm_map_name] => test map [pm_map_id] => 2 [pm_id] => 10 [pm_title] => Test \" \' \\ [pm_u_from] => 14 [pm_read] => 1 [pm_timestap] => 1095261697 [u_id] => 2 [u_nickname] => vrouw1 )
Array ( [pm_map_name] => test map [pm_map_id] => 2 [pm_id] => 10 [pm_title] => Test \" \' \\ [pm_u_from] => 14 [pm_read] => 1 [pm_timestap] => 1095261697 [u_id] => 7 [u_nickname] => Man2 )
Array ( [pm_map_name] => test map [pm_map_id] => 2 [pm_id] => 10 [pm_title] => Test \" \' \\ [pm_u_from] => 14 [pm_read] => 1 [pm_timestap] => 1095261697 [u_id] => 9 [u_nickname] => vrouw2 )
Array ( [pm_map_name] => test map [pm_map_id] => 2 [pm_id] => 10 [pm_title] => Test \" \' \\ [pm_u_from] => 14 [pm_read] => 1 [pm_timestap] => 1095261697 [u_id] => 14 [u_nickname] => /\\ )


Er is echter maar 1 entry voor pm (personal message ;)), maar hij laat ze bij elke u_id in de database zien. [ipv waar u_id == pm_u_from].
Dus doe ik het volgende in de query (bij de where clause):
AND u.u_id = p.pm_u_from

Ik zou dan alleen het laatste bericht moeten zien, omdat u_id en pm_u_from daar overeen komen, maar ik zie echter niks...voor mij een raadsel...

Dit zou toch moeten werken?

Roemer

  • Morphine
  • Registratie: Februari 2002
  • Laatst online: 19-05 18:28
lijkt op hetzelfde als ik had, zie :
[rml][ mysql query] Or Iets, Or Niets ?[/rml]

Verwijderd

Topicstarter
nee, denk het niet, want alle velden in de where clause moeten een waarde hebben. dmv pm_u_from en u_id wil ik namelijk u_nickname uitlezen...

  • Morphine
  • Registratie: Februari 2002
  • Laatst online: 19-05 18:28
INNER join gaan gebruiken ipv where

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Morphine schreef op 16 september 2004 @ 19:37:
INNER join gaan gebruiken ipv where
Hoezo dat, is er een verschil?

Who is John Galt?


Verwijderd

Topicstarter
met de volgende query maakt het geen verschil:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$query = "
        SELECT
            pm.pm_map_name,
            pm.pm_map_id,
            p.pm_id,
            p.pm_title,
            p.pm_u_from,
            p.pm_read,
            p.pm_timestap
        FROM
            " . $config['mysql']['prefix'] . "pm AS p,
            " . $config['mysql']['prefix'] . "pm_maps AS pm
        INNER JOIN " . $config['mysql']['prefix'] . "users ON (u_id = p.pm_u_from)
        WHERE
            p.pm_map_id_to = $map_id
        AND
            pm.pm_map_id = p.pm_map_id_to
        AND
            p.pm_u_to = " . $_SESSION['user']['id'] . "
        ";

Verwijderd

Morphine schreef op 16 september 2004 @ 19:37:
INNER join gaan gebruiken ipv where
correct me if I'm wrong, maar een FROM bla, bla WHERE blaat = '$blaat' levert gewoon een INNER JOIN op. Wat is het probleem met deze manier van schrijven?

  • BrZ
  • Registratie: Maart 2000
  • Laatst online: 20-05 16:16

BrZ

Er wordt nergens een vergelijking met de tabel users en een van de andere tabellen gedaan, dat betekent dat elke combinatie met de tabel users gemaakt wordt. Dit houdt dus in dat die ene pm bij elke user(row) terecht komt.

[ Voor 8% gewijzigd door BrZ op 17-09-2004 00:54 ]


Verwijderd

Topicstarter
Maar als ik
code:
1
AND u.u_id = p.pm_u_from
aan de where clause toevoeg zou het toch wel moeten werken? Maar dan krijg ik geen enkele row terug terwijl ik de row van user /\\ terug moet krijgen...?

  • BrZ
  • Registratie: Maart 2000
  • Laatst online: 20-05 16:16

BrZ

hmm, ik moet vroeger slapen, mijn antwoord slaat nergens op, dat is precies wat je in je topicstart al zei :X

Maar met "AND u.u_id = p.pm_u_from" erbij zou je inderdaad die rij van user "/\\" terug moeten krijgen...

Verwijderd

Topicstarter
Als ik de volgende query in PHPMyAdmin run, krijg ik wel gewoon de goede rij terug.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT
    pm.pm_map_name,
    pm.pm_map_id,
    p.pm_id,
    p.pm_title,
    p.pm_u_from,
    p.pm_read,
    p.pm_timestap,
    u.u_nickname,
    u.u_id
FROM
    d2d_pm AS p,
    d2d_pm_maps AS pm,
                d2d_users AS u
WHERE
    p.pm_map_id_to = 2
AND
    pm.pm_map_id = p.pm_map_id_to
AND
    p.pm_u_to = 1
AND
    u.u_id = p.pm_u_from


Dit is ook gewoon de query dit ik uitvoer, want ik heb hem voor mysql_query ge-echo-ed.

Waarschijnlijk ligt het dan dus aan m'n script.
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
25
26
27
28
29
30
<? $result = query( $query );

if( mysql_num_rows( $result ) > 0 )
{
    # er zijn pm's in de inbox

    echo mysql_result( $result, 0, 'pm_map_name' );
    ?>
    <table width='100%' border='1'>
     <tr>
      <td>Van</td>
      <td>Titel</td>
      <td>Datum</td>
     </tr>
    <?
    while( $pm = mysql_fetch_array( $result, MYSQL_ASSOC ) )
    {
        # alle berichten weergeven (van, titel, datum)
        echo '<tr><td>' . ( $pm['pm_read'] == 1? "&nbsp;" : "*" ) . '</td><td>' . data2output( $pm['u_nickname'] ) . '</td><td><a href="pm.php?act=read&id=' . $pm['pm_id'] . '">' . data2output( $pm['pm_title'] ). '</a></td><td>' . date( 'd-M-Y', $pm['pm_timestap'] ) . '</td></tr>';
    }
    ?>
    </table>
    <?
}
else
{
    # er zijn geen pm's
    echo "U heeft geen PM's";
}
?>


Ik snap er nu echt helemaal niks meer van...

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

kvdveer

Z.O.Z.

Iets waar ik ooit dergelijke resultaten mee kreeg was de typejugling van mysql...
Mysql denkt namelijk dat iedere string gelijk is aan de integer 0. Aangezien joins afhankelijk zijn van het vergelijken van data kan dat wel eens problemen opleveren.

Controleer dus even of je unique (of primary key) constraints hebt staan op je id's, controleer of je foreignkey datatypen overeenkomen met je id's.

Localhost, sweet localhost


Verwijderd

Topicstarter
p.pm_u_from en u.u_id zijn allebij int(5) en u_id is UNIQUE.

Maar waarom kan phpmyadmin wel gewoon het goede resultaat tonen met dezelfde query?

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Is het wel dezelfde query?
Echo hem eens voor je hem uitvoert.

Who is John Galt?


Verwijderd

Topicstarter
quote: roemer
...Dit is ook gewoon de query dit ik uitvoer, want ik heb hem voor mysql_query ge-echo-ed...
Ik heb dus m'n query ge-echo-ed, ctrl+insert, phpmyadmin->sql, shift+instert en daar kreeg ik wel gewoon het goede resultaat...

[ Voor 4% gewijzigd door Verwijderd op 17-09-2004 19:59 ]


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Ah daar had ik even overheen gelezen :o
Wat krijg je dan als uitvoer in je html?
een lege tabel of 'u heeft geen pm's'?

Who is John Galt?


Verwijderd

Topicstarter
Ik krijg de naam van de map waarin ik wil zoeken en verder een lege tabel

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Zitten er wel lege rijen in die tabel?

Who is John Galt?


Verwijderd

Topicstarter
Om nog even antwoord te geven: nee

Je had met op een of andere manier laten denken aan de mysql result pointer, en dat die misschien al bij row 1 was ipv 0 door de eerste mysql_result om de map naam tevoorschijn te halen.

Door
code:
1
mysql_data_seek( $result, 0 );
voor de while lus te zetten is het opgelost :D

Tnx voor de rare gedachtensprong die je me liet maken ;)

en natuurlijk alle anderen die mee hebben gedacht ;)
Pagina: 1