Pytanie w sprawie php, mysql, join – Połącz dwie tabele mysql z php

2

Na przykład stworzyłem 2 strony i 2 tabele MySQL.

Index.php & citys.php

miasta

<code> ID     City       Country  Population
 --------------------------------------
 1      Amsterdam     NL     1500000
 2      Rotterdam     NL     900000
 3      Dusseldorf    DE     1800000
</code>

komentarze

<code>ID   City        Name   Comment
--------------------------------- 
 1   Dusseldorf  Jack   Great city!
 2   Dusseldorf  John   Beautiful     
 3   Rotterdam   Emy    Love it
</code>

W tej chwili używam tylko stołucitys lubię to:

index.php linkowanie docitys.php z:

<code><a href='citys.php?cmd=menu&id=";echo $row['id'];echo "'>
</code>

Icitys.php użyj tego kodu, aby wyświetlić dane z MySQL:

<code><?php
include "connect.php";
    if(!isset($cmd)) 
    {
        if($_GET["cmd"]=="menu" || $_POST["cmd"]=="menu")
        {
            if (!isset($_POST["submit"]))
            { 
            $id = $_GET["id"];
            $sql = "SELECT * FROM citys WHERE id=$id";
            $result = mysql_query($sql);        
            $row = mysql_fetch_array($result);
?> 
<?php echo $row["City"] ?>
<br><br>
<?php echo $row["Country"] ?>
<br><br>
<?php echo $row["Population"] ?>
</code>

Do tego czasu wszystko pokazuje się i działa dobrze.

Ale to, co chcę osiągnąć, to także pokazanie komentarzy na stronie 2. Zatem zapytanie musi być edytowane, aby uzyskać odpowiednie dane z tabelicomments.

Próbowałem różnych przykładów z Internetu, które sam edytowałem, takich jak:

<code><?php
include "connect.php";
    if(!isset($cmd)) 
    {
        if($_GET["cmd"]=="menu" || $_POST["cmd"]=="menu")
        {
            if (!isset($_POST["submit"]))
            { 
            $id = $_GET["id"];
            $sql = "SELECT citys.*, comments.* FROM citys, comments WHERE citys.id=$id AND comments.city=citys.city";
            $result = mysql_query($sql);        
            $row = mysql_fetch_array($result);
?>
</code>

Ale nic nie działa.

Ktokolwiek może pomóc?

Edytować!

Zapytanie z odpowiedzi VIPIN JAIN działa, ale pozostaje jeden problem:

Pytanie:

<code>$sql = "SELECT * FROM citys LEFT JOIN comments ON comments.city=citys.city WHERE citys.id=$id";
</code>

Jeśli tabela „komentarze” ma 3 wiersze, ten kod pokazuje tylko dwa ostatnie, ale nie pierwszy:

<code><?php while($row = mysql_fetch_array($result)) { 
    echo "<br><br>";     
    echo $row['name']; 
    echo "<br>"; 
    echo $row['comment'];
} 
?>
</code>

A jeśli spróbuję to pokazuje tylko pierwszy wiersz.

<code><?php echo $row["name"] ?> 
<br> 
<?php echo $row["comment"] ?>
</code>

Nie wiem, dlaczego pierwszy rekord został pozostawiony w pętli.

Aby nieco wyjaśnić to pytanie, możesz opublikować definicje tabeli. Nie jestem pewien, czy tabele się odnoszą. Masz identyfikator w obu tabelach, które zakładam, że jest kluczem podstawowym. Ale z tego, co widzę, umieszczasz nazwy miast w tabeli komentarzy jako klucz obcy dla miast? Gdybyś mógł mi pokazać definicję tabeli, mógłbym pomóc. Namphibian
Po prostu napisałem naprawdę długie pytanie i odpowiedź, które obejmuje to dokładnierodzaj pytania Mam nadzieję, że pomoże to wyjaśnić, w jaki sposób połączenia działają na tabelach i jak uzyskać informacje z wielu tabel w bazie danych! Fluffeh

Twoja odpowiedź

2   odpowiedź
4

Użyj tego zapytania

<code>$sql = "SELECT * FROM citys LEFT JOIN comments ON comments.city=citys.city WHERE citys.id=$id";
</code>

Używaj leftjoin do tego typu pracy

może powinieneś użyć 2 zapytań dla powyższego, ponieważ złączenia sprawią, że program zajmie więcej niż wymagana pamięć. Więc dla lepszej opcji przejdź do wielu zapytań. tj. zarówno dla tabeli miast, jak i tabeli komentarzy. Vipin Jain
Jeśli używam tego <? Php echo $ row ["naam"]?> <br> <? Php echo $ row ["comment"]?> <? Php while ($ row = mysql_fetch_array ($ result)) {echo " <br> <br> "; echo $ row ['naam']; echo „<br>”; echo $ row ['comment']; }?> pokazuje wszystkie komentarze we właściwej kolejności. Nie wiem, czy to właściwy sposób, ale działa dla mnie! Thx za pomoc. Maxcim
Mam jeszcze jedno pytanie dotyczące zapytania. Wygląda na to, że pole "miasto" nie jest ładowane po zapytaniu Przykład: <? Php echo $ row ["kraj"]?> Daje krajowi, <? Php echo $ row ["miasto]?> Nic nie daje. Maxcim
hmmm, wciąż problem. Jeśli jest komentarz na temat miasta, wszystko działa dobrze. Ale jeśli w tabeli Komentarze nie ma zapisów o mieście, tak się dzieje, zanotuj NULL po Amsterdamie. Tablica 0 => ciąg '1' (length = 1) 'id' => null 1 => ciąg 'Amsterdam' (długość = 9) 'city' => null 2 ​​=> ciąg 'NL' (długość = 2) ' country '=> ciąg „NL” (długość = 2) 3 => ciąg „1500000” (długość = 7) „populacja” => ciąg „1500000” (długość = 7) 4 => null 5 => null 6 => null 'name' => null 7 => null 'comment' => null A potem <? php echo $ row ["miasto]?> nic nie daje Maxcim
2
<code>select * from citys 
left join comments on comments.city = citys.city 
where citys.id=$id
</code>
Możesz przyzwyczaić się do używaniaLEFT OUTER JOIN. Pomaga to uniknąć błędu, jeśli nie może znaleźć wiersza dopasowania. user1031030

Powiązane pytania