Подскажите как делать выборку с отбором по нескольким терминам таксономии.
Я было взялся составялть запрос и присел.
$result = db_query('SELECT td.name FROM {term_node} tn, {term_data} td
WHERE tn.tid = td.tid AND td.vid = %d AND tn.tid = %d', $vid_results, $tid_festival);
Термины то храняться в одной таблице, а мне надо чтобы выборка была по терминам вида "Результаты" и с отбором по одному выбранному термину вида "Фестивали". Про views не надо напоминать. Приходится потом его результаты подделывать под себя. А я хочу попробовать сразу выбрать и вывести как мне надо.
Комментарии
а что мешает воспользоваться кодом taxonomy_select_nodes
выбрать ноды у каждый из которых два конкретных термина чтоли? Или и не ноды вовсе? судя по вашему sql запросу вы выбираете название термина в словаре
Да в моем примере я хотел просто для начала отобрать термины с полем nid, а потом привязать к ним материалы.
Если описать мою задачу, то дело обстоит так:
Есть материалы "Конкурс". У каждого есть термины "Фестиваль" и "Результат участия"
Т.е. таблица term_data выгдядит примерно так:
tid | vid |name
4 | 3 |Фестиваль 1
5 | 3 |Фестиваль 2
6 | 4 |Первое место
7 | 4 |Второе место
Вот мне нужно сделать выбоку всех результатов по конкретному фестивалю.
На сколько я понял taxonomy_select_nodes не подойдет. Туда нужно tid передавать и условие навешивать. 4 AND 6 AND 7 не подходит, т.к. не даст вообще результата.
4 OR 6 OR 7 включит результаты второго фестиваля.
ага, понятно. вот два способа, второй пожалуй более быстрый и корректный (выбираются только nid, потом прикрутите подгрузку через node_load)
4, 5 - tid терминов которые должны одновременно быть у выбираемых нод
SELECT nid, GROUP_CONCAT( tid ) AS tids
FROM `term_node`
GROUP BY `nid`
HAVING FIND_IN_SET( 4, tids )
AND FIND_IN_SET( 5, tids )
SELECT t1.nid
FROM term_node t1
INNER JOIN term_node t2 ON t1.nid = t2.nid
WHERE t1.tid =4
AND t2.tid =5
Прикольно. Никогда еще не приходилось связывать таблицу саму с собой. Я на друпале недавно. Раньше строил таблицы под запросы, теперь приходится строить запросы исходя из имеющихся таблиц. Я уже сделал через views, т.к. время поджимало и не был уверен в том что мне помогут. Но попробовал все таки сделать нужный мне запрос. Получилось примерно вот так:
$result = db_query('SELECT td.name, tn1.nid FROM {term_node} tn1
INNER JOIN {term_node} tn2 ON tn1.nid = tn2.nid
INNER JOIN {term_data} td ON tn2.tid = td.tid
WHERE td.vid = %d AND tn1.tid = %d', $vid, $festival);
Попробовал. Вроде бы то что надо. Выводятся имена результатов с номерами нод по выбранному фестивалю.
Спасибо restyler за помощь.
Вдогонку еще хочу спросить. Почему изначально не хотел делать на views, дак это потому, что мне нужно было выводить результаты конкурсов с группировкой по категориям участников. Т.е.
Проф. исполнение
Иванов | Первое место
Петров | Второе место
Любители
Иванов | Первое место
Петров | Второе место
Можно ли во views это сделать стандартными средствами, без программирования. Не стандартными я уже сделал, но хочу узнать, может все проще как то делается.
ну два views сделать можно, и программно их вызвать на ноде с php форматом.
tid - это уникальный автоинкрементный ключ, т.е. WHERE td.vid = %d - бессмысленное условие, если знаешь нужные term id. в двух словарях одинаковых tid быть не может
you are welcome![Smile](https://drupal.ru/sites/all/modules/contrib/smiley/packs/kolobok/smile.gif)
> ну два views сделать можно, и программно их вызвать на ноде с php форматом.
Че-то сложновато для меня.
>tid - это уникальный автоинкрементный ключ, т.е. WHERE td.vid = %d - >бессмысленное условие, если знаешь нужные term id. в двух словарях одинаковых >tid быть не может
В том то и дело, что нужных term id я не знаю. Я это условие наложил чтобы у меня в выборку попали результаты всех видов (термины словаря "Результаты"). Один единственный term id который известен - это код фестиваля.
В конечном итоге отказался от views и сделал своим запросом. (views почему то не дал мне отсортировать по терминам. По nid дает, а по терминам словаря нет поля для выбора сортировать или нет). В итоге запрос вот такой вышел:
$result = db_query('SELECT td1.name AS result,td2.name AS category,
profiles.value AS user_name FROM {term_node} tn1
INNER JOIN {term_node} tn2 ON tn1.nid = tn2.nid
INNER JOIN {term_data} td1 ON tn2.tid = td1.tid
INNER JOIN {term_node} tn3 ON tn2.nid = tn3.nid
INNER JOIN {term_data} td2 ON tn3.tid = td2.tid
INNER JOIN {content_field_user} cfu ON cfu.nid = tn1.nid
INNER JOIN {profile_values} profiles ON cfu.field_user_uid = profiles.uid
WHERE profiles.fid = 1 AND td1.vid = %d AND td2.vid = %d AND
tn1.tid = %d AND td1.name <> ""
ORDER BY td2.weight,td2.tid, td1.weight, td1.tid, user_name',
$vid_results,$vid_categories,$festival);
А результат запроса в таком виде:
Профессиональное исполнение
Гран-при фестиваля-конкурса Полкопин Дмитрий
I место и звание лауреата Иванова Оксана
I место и звание лауреата Шагалов Георгий
Любительское исполнение
II место и звание лауреата Канахина Юлия
II место и звание лауреата Толстова Татьяна
III место и звание лауреата Касимов Рамзи
Именно то чего и хотел.