MYSQL, PHP) получить значения из всех столбцов из нескольких таблиц, используя UNION ALL - PullRequest
0 голосов
/ 06 октября 2018

Мне нужно зациклить две разные таблицы и получить значения из всех столбцов.

Я пытался использовать UNION ALL, чтобы решить мою проблему.

Код выглядит следующим образом:

if(isset($_GET['country'])){
        $sql = "SELECT name, capital, population,description,null FROM countries WHERE name ='France'

        UNION ALL
             SELECT null,null,null,null,attraction_name FROM attraction_list WHERE country_name='France'
        ";
        mysqli_select_db($conn,'travelapp') or die("database not found");
        $result = mysqli_query($conn,$sql);
        if($result){
            $countryName;$capital;$population;$description;$attraction;
            while($row = $result->fetch_row()){
                $countryName=$row[0];
                $capital=$row[1];
                $population=$row[2];
                $description=$row[3];
                $attraction=$row[4];
            }
            $resultArray = array(
                'country'=>$countryName,
                'capital'=>$capital,
                'population'=>$population,
                'description'=>$description,
                'attraction'=>$attraction
            );
            echo json_encode($resultArray);
        }
    }

Однако этот код работает не так, как я ожидал.Я ожидал напечатать

имя, капитал, население, описание из таблицы стран и имя_привлечения из таблицы привлечений.

Итак, результат, который я ожидал, должен выглядеть следующим образом:

{"страна": Франция, "столица": Париж, "население": 64750000, "описание": некоторый текст, "аттракцион": La Vieille Charite}

но что делает мойphp распечатайте сейчас: enter image description here

Это проблема цикла while?или, может быть, есть гораздо лучшее решение, чем UNION ALL?

1 Ответ

0 голосов
/ 07 октября 2018

То, что вы на самом деле хотите, это LEFT JOIN.Используйте LEFT JOIN, если есть страны без достопримечательностей.Попробуйте это:

$sql = "SELECT c.name, c.capital, c.population, c.description, a.attraction_name 
        FROM countries c
        LEFT JOIN attraction_list a ON a.country_name = c.name
        WHERE c.name ='France'";

Этот запрос даст вам несколько строк, если в стране есть несколько достопримечательностей, например

{"country":France, "capital":Paris, "population": 64750000, "description":Some text, "attraction":La Vieille Charite},
{"country":France, "capital":Paris, "population": 64750000, "description":Some text, "attraction":Eiffel Tower}

Если вам нужна только одна строка, например

{"country":France, "capital":Paris, "population": 64750000, "description":Some text, "attraction":La Vieille Charite, Eiffel Tower}

Вы можете использовать GROUP BY для агрегирования, например,

$sql = "SELECT c.name, c.capital, c.population, c.description, GROUP_CONCAT(a.attraction_name)
        FROM countries c
        LEFT JOIN attraction_list a ON a.country_name = c.name
        WHERE c.name ='France'
        GROUP BY c.name";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...