La2ha
@La2ha

Не работает подзапрос с несколькими полями

Решил попробовать одним запросом сделать то что обычно делал двумя, но что-то ругается MySQL.
Имеются 3 таблицы.
image
Нужно получить com_dvr(видеорегистратор) и срязанных с ним продавцов.
Но только я решил попробовать проверить будет ли это работать вот так
SELECT s.*, (SELECT dwr.title as dvr_title FROM com_dvr AS dwr) AS sellers FROM (`com_dvr_sellers` AS s)

И оно мне сразу сообщает что подзапрос возвращает более одной строки, но мне это и нужно, я рассчитывал что получится из этого многомерный массив сделать
  • Вопрос задан
  • 3765 просмотров
Решения вопроса 1
KEKSOV
@KEKSOV
С учетом Вашего дополнения запрос нужно немного изменить:
SELECT seller.title seller_title, rel.price price, dvr.title dvr_title,dvr.id dvr_id FROM com_dvr dvr
LEFT JOIN com_dvr_relations rel ON dvr.id = rel.item_id
LEFT JOIN com_dvr_sellers seller ON rel.seller_id = seller.id;
ORDER BY dvr_title, dvr.id, seller.title, rel.price


И обработать результат следующим образом (пишу на псевдокоде, похожим на PHP ):
$mysqli = new mysqli("example.com", "user", "password", "database");
(проверка на ошибку запроса)
$res = $mysqli->real_query($sql);
$mysqli->store_result();

// Получаем результат
$result = array();
while ($row = $res->fetch_assoc()) 
{
    $dvrId = $row[  'dvr_id' ];
    if ( !isset($result[$dvrId] )
    {
        $result[ $dvrId ] = array();
        $result[ $dvrId ][ 'dvr_title' ] = $row[ 'dvr_title' ];
        $result[ $dvrId ][ 'sellers' ] = array();
    }

    $result[ $dvrId ][ 'sellers' ][] = array(
        'seller_title' => $row[ 'seller_title' ]
       , 'seller_price' => $row['price']
    );
}

echo "<pre>";
var_dump( $result );


Ответ написан
Пригласить эксперта
Ответы на вопрос 2
bredmm
@bredmm
вы написали какую то очень странную конструкцию
судя по всему вам надо что-то такое

SELECT 
    dvr.* ,
    sellers.*
FROM
    com_dvr as dvr
    JOIN com_dvr_relations as rel ON (dvr.id = rel.item_id)
    JOIN com_dvr_sellers as sellers ON (rel.item_id = sellers)
Ответ написан
KEKSOV
@KEKSOV
Если я правильно понял задачу, то вот:

SELECT sell.* FROM com_dvr dvr
LEFT JOIN com_dvr_relations rel ON dvr.id = rel.item_id
LEFT JOIN com_dvr_sellers sell ON rel.seller_id = sell.id;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы