2014-04-04 3 views
1

Я стараюсь перечислять все продукты с изображениями продуктов, но не знаю, как использовать subquery в этой ситуации. Ниже моя структура базы данныхВыберите таблицу с подзапросом

продукты

products_id + product_name + 
    1  | Apple  | 
    2  | Banana | 

products_screenshot

products_id +  images  + 
    1  | Apple-1.jpg  | 
    1  | Apple-2.jpg  | 
    1  | Apple-3.jpg  | 
    2  | Banana-1.jpg | 
    2  | Banana-2.jpg | 
    2  | Banana-3.jpg | 

это мой запрос:

$sql = "SELECT p.* FROM `products` p ORDER BY p.products_id ASC "; 

//LEFT JOIN (SELECT ps.* FROM `products_screenshot` ps WHERE ps.products_id=p.products_id) AS pss ON(p.products_id=pss.products_id) 

$query = $db->query($sql); 

while ($row = $query->fetch_object()) { 

    // result 
    echo $row->products_name.'</br>'; 

    // list all product screenshot related with this 
    //$row->images 

} 

ответ

3

С вашим требованием вы можете сделать, как показано ниже. Затем выполните запрос и выполните цикл. $ row-> изображения будут разделены запятой, и вы можете разделить их на отображение их для продукта.

$sql = "SELECT p.products_id,p.product_name,group_concat(pi.images) as `images` 
FROM `products` p 
left join products_screenshot pi on pi.products_id = p.products_id 
group by p.products_id 
ORDER BY p.products_id "; 

Если вы не заботиться о продуктах повторяется несколько раз в цикле, то просто используйте ниже, где для каждого цикла вы получите новую строку с продуктом и связанные изображения

$sql = "SELECT p.products_id,p.product_name,pi.images 
FROM `products` p 
left join products_screenshot pi on pi.products_id = p.products_id 
ORDER BY p.products_id "; 
+0

В результате я разделил эту строку на массив, используя explode '$ images_array = explode (',', $ row-> images);' – rusly

0

Попробуйте этот запрос:

select products.product_name, products_screenshot.images from products,products_screenshot where products.products_id = products_screenshot.products_id 
1

Что случилось с простым запросом, как это:

select 
    p.products_id, 
    p.product_name, 
    ps.images 
from 
    products p 
     join products_screenshot ps 
      on p.products_id=ps.products_id 
where 
    whateveryouline 
order by 
    1,2 

Он получит Вас все предметы, которые нужны?

+1

Он также даст ему возврат таблицы продуктов для каждой строки в таблице изображений, так что да, для меня я сделаю это по-своему и обнаружил бы уникальный идентификатор продукта в цикле, чтобы выплескивать заголовки/название продукта один раз и т. Д. Он может быть а также просто выполняет второй запрос внутри своего основного, сохраняя его простым, пока он учится. – Dave

+0

@Dave Я никогда не нахожу ничего плохого в возвращении всех необходимых данных в одном запросе (ну, почти никогда, так или иначе), а затем просто сортируюсь в простой объект, который сортирует вещи по мере необходимости. – Fluffeh

+0

Да, нет, но учитывая, что он борется с основами :) более продвинутый материал может быть вне его досягаемости. – Dave

0
SELECT * from products_screenshot as ps where products_id IN (SELECT p.products_id from products as p WHERE p.products_id = ps.products_id) 
Смежные вопросы