Каверзный вопрос по множетсвенной выборке в Mysql

Главные вкладки

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 1 ноября 2010 в 20:31

Разбираюсь со сложными(для меня) SQL запросами.

Практический пример:

есть термин таксономии, скажем 10, имея который, нужно взять пути к файлам поля Imagecache в нодах, которые имеют тип 'product' и помечены этим термином (т.е id 10). Пути к файлам нужны не все, а один, скажем первый встреченный.

Я довольно быстро настрочил такое:

<?php

$childterm 

10// Термин;
$result db_fetch_array(db_query("SELECT node.vid FROM node 
                  JOIN term_node ON  node.vid=term_node.vid 
                  WHERE term_node.tid=
$childterm 
                  AND node.type= 'product' 
                  LIMIT 0, 1"
));
$nvid $result['vid']; 
$result db_fetch_array(db_query("SELECT field_image_cache_fid 
                  FROM 
$image_table 
                  WHERE vid = '%d'"
$nvid));
$fid $result['field_image_cache_fid'];
$result db_fetch_array(db_query("SELECT filepath FROM files 
                  WHERE files.fid = '%d'"
$fid));
$filepath $result['filepath'];

?>

Невооружённый взглядом видно, что тут аж 3 запроса+гора быдлокода, но это работает

Мне на Stackowerflow подсказали такой код:

<?php

$childterm 

10// Термин;
$sql "SELECT f.filepath FROM {node} AS n
INNER JOIN {term_node} AS t ON t.nid = n.nid
INNER JOIN {content_field_image_cache} as c ON c.nid = n.nid
INNER JOIN {files} AS f on f.fid = c.fid
WHERE n.type = '%s'
AND t.tid = '%d'"
;

$result db_query($sql'product'$childterm);

?>

Это выглядит намного убедительнее, но не работает. Кто наставит на правильный путь?

Ещё картинка

Комментарии

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 1 ноября 2010 в 20:52

В моём варианте связано по vid, но во втором варианте - по nid. Наверное ошибка, но по vid, я пробовал, тоже не работает.

Хз, мозг уже не работает, на пару сраных строк угробил весь день

Аватар пользователя Виктор Степаньков ака RxB Виктор Степаньк... 1 ноября 2010 в 21:06

У меня у самого моск уже не воркает, понедельник день тяжёлый + перевод часов, так штоле:

SELECT f.filepath FROM node n INNER JOIN term_node tn ON tn.vid = n.vid  INNER JOIN content_field_image_cache cf ON cf.vid = n.vid INNER JOIN files f ON f.fid = cf.fid WHERE n.type = 'product' AND tn.tid = 10

Вроде всё связал, но нет подобной структуры вроде как под рукой

Аватар пользователя gorr gorr 1 ноября 2010 в 22:30

<?php
SELECT f.filepath FROM node n
INNER JOIN term_node tn ON tn.vid = n.vid
INNER JOIN content_field_image_cache cf ON cf.vid = n.vid
INNER JOIN files f ON f.fid = cf.field_image_cache_fid
WHERE n.type = 'product' AND tn.tid = 10
?>

(c) RxB

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 1 ноября 2010 в 23:25

"gorr" wrote:
<?php
SELECT f.filepath FROM node n
INNER JOIN term_node tn ON tn.vid = n.vid
INNER JOIN content_field_image_cache cf ON cf.vid = n.vid
INNER JOIN files f ON f.fid = cf.field_image_cache_fid
WHERE n.type = 'product' AND tn.tid = 10
?>

(c) RxB

Это заработало Smile

Полная версия, авось кому-нибудь понадобиться

<?php

$childterm 

10;// Термин таксономии
$nodetype 'product';// Тип документа
$sql "SELECT f.filepath FROM node n 
        INNER JOIN term_node tn ON tn.vid = n.vid  
        INNER JOIN content_field_image_cache cf ON cf.vid = n.vid 
        INNER JOIN files f ON f.fid = cf.field_image_cache_fid 
        WHERE n.type = 
$nodetype AND tn.tid = $childterm LIMIT 0, 1";
        
$result db_fetch_array(db_query($sql));
    
$filepath $result['filepath']; // Путь к картинке

?>

Спасибо всем участникам дискуссии, особенно Виктору Smile