Объединить несколько запросов MySql в один запрос - PullRequest
1 голос
/ 01 ноября 2010

Я пытаюсь решить проблему второго дня, но пока безуспешно.

Моя цель:

Для определенного идентификатора термина таксономии (например, 1) мне нужно получить хотя бы один путь к файлу поля изображений, принадлежащий этому идентификатору термина (tid 1)

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

$childterm = 10; // Taxonomy term ID
$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']; // Extracting node VID by term ID that will be used futher 

$result = db_fetch_array(db_query("SELECT field_image_cache_fid FROM
                                   content_field_image_cache WHERE
       vid = '%d'", $nvid));

$fid = $result['field_image_cache_fid']; // Extracting file ID from array

$result = db_fetch_array(db_query("SELECT filepath FROM files WHERE
                                   files.fid = '%d'", $fid));           

$filepath = $result['filepath']; // Finally. Extracting file path from array

Пожалуйста, посмотрите на картинку.

alt text Как я могу улучшить запрос? Могу ли я получить значение filepath, используя только один SQL-запрос?

Заранее спасибо.

Ответы [ 2 ]

5 голосов
/ 01 ноября 2010

Примерно так должно работать.

$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, $ node_type, $ tid);

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

$db_info = content_database_info(content_fields($field_name));

Причина в том, что SQL будет прерываться, если вы переключились с / на несколько значений, если только вы не используете этот метод для дополнительных имен таблиц и столбцов.

1 голос
/ 01 ноября 2010

Я принял ответ от @googletorp.Хотя его решение не помогло мне на 100%, оно указало верное направление.

Вот правильный код:

$childterm = 10;// taxonomy term
$nodetype = 'product';// node type
$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']; // image path

Спасибо, вы все классные парни!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...