Объединить две таблицы MySQL в PDO и создать вывод CSV

#php #mysql #pdo

#php #mysql #pdo

Вопрос:

новое здесь. Я сделаю все возможное, чтобы сформулировать этот вопрос как можно более четко.

Я создаю базу данных заказов, в этой базе данных у меня есть две таблицы.

Таблица 1 (заказы) содержит следующие столбцы:

 id, name, datetime
 

Таблица 2 (упорядоченные элементы) содержит следующие столбцы:

 id, orderid, itemname, price
 

orderid в таблице 2 находится id в таблице 1

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

orderid, datetime, name, itemname, price

Вот как я выбираю заказы:

 $date1 = "2020-09-29"; //$_GET["date1"];
$date2 = "2020-09-30"; //$_GET["date2"];

include 'dbconfig.php';

$pdo = new PDO("mysql:charset=utf8mb4;host=$servername;dbname=$dbname", $username, $password);

$pdo = $pdo->prepare("SELECT id, name datetime FROM orders WHERE datetime BETWEEN :date1 AND :date2");

$pdo->execute(['date1'  =>  $date1,
               'date2'  =>  $date2]); 
 
while ($row = $pdo->fetch()) {
    $data[] = $row;
}
 

и вот как я выбираю элементы заказа:

 $sql = "SELECT orderid, itemname, price FROM orderitems WHERE orderid=:id";
 

Как мне объединить их и заставить их экспортировать массив так, как я хочу?

Ответ №1:

Вы уже можете выполнить объединение в SQL, и вам нужно только отправить этот один запрос в базу данных, а не один для заказов, а затем по одному для деталей заказа. Это намного быстрее. Этот запрос будет:

 SELECT o.id orderid,
       o.datetime,
       o.name,
       oi.itemname,
       oi.price
       FROM orders o
            INNER JOIN ordered oi
                       ON oi.orderid = o.id
       WHERE o.datetime >= :date1
             AND o.datetime < :date2;
 

И не используйте BETWEEN для диапазонов временных меток. Если ваша верхняя граница равна 2020-09-30, вы получите только записи с 2020-09-30 00:00:00.000. Но вы пропустите, например, 2020-09-30 01:01:00.000. Используйте < для сравнения верхней границы и следующего дня, т.Е. 2020-10-01, в качестве значения.