Drupal ищет пользователя по имени профиля и запросу по фамилии

Я пишу модуль, который позволяет быстро добавлять пользователей, только указав имя и фамилию (без электронного адреса или имени пользователя). Эти пользователи похожи на призраков, только для временного использования. Перед добавлением пользовательского модуля необходимо проверить, существует ли уже в системе пользователь с таким же именем и фамилией, чтобы избежать создания нескольких пользователей-призраков с одинаковыми личными именами. Другими словами, мне нужен sql-запрос для фильтрации пользователей по фамилии и имени. До сих пор мне удавалось создать такой запрос:

$sql = "SELECT DISTINCT u.uid AS uid FROM users u INNER JOIN profile_values pv ON u.uid = pv.uid INNER JOIN profile_fields pf ON pv.fid = pf.fid "
                ."WHERE pf.fid = 2 AND pv.value = '%s'";
            $uid = db_fetch_object(db_query("$sql", $ln))->uid;

Этот запрос недостаточно хорош, так как он находит пользователя только по совпадению фамилии. Я не эксперт по sql, но я понятия не имею, как объединить таблицы, чтобы сузить результаты, чтобы имя и фамилия совпадали: что-то вроде этого

WHERE pf.fid = 2 AND pv.value = 'LASTNAME' AND pf.fid = 1 AND pv.value = 'FIRSTNAME';

В моей таблице profile_fields у меня есть: fid = 2 -> lastname fid = 1 -> firstname

И последнее предложение WHERE работать не будет. Я надеюсь, что те, кто знаком с взаимосвязью таблиц профиля и пользователя в системе Drupal, знают, о чем я прошу.


person Lukasz    schedule 02.07.2010    source источник


Ответы (1)


вам нужно присоединиться дважды с разными псевдонимами. Что-то типа:

$sql = "SELECT DISTINCT u.uid AS uid FROM {users} u 
INNER JOIN {profile_values} pv ON u.uid = pv.uid 
INNER JOIN {profile_fields} pf ON pv.fid = pf.fid
INNER JOIN {profile_values} pv2 ON u.uid = pv2.uid 
INNER JOIN {profile_fields} pf2 ON pv2.fid = pf2.fid
WHERE pf.fid = 2 
AND pv.value = '%s'
AND pf2.fid = 1 
AND pv2.value = '%s'";

 $uid = db_fetch_object(db_query("$sql", array($ln, $fn)))->uid;

Также с drupal вы должны поместить {} вокруг имен таблиц.

person Jeremy French    schedule 02.07.2010
comment
Ты хороший. Он работал как шарм и такой чистый запрос. Я попытался посмотреть, как модуль Views построит его, но получился очень грязный ;-) - person Lukasz; 02.07.2010
comment
да. Я знал о {}. Просто вставил его из моего генератора запросов. - person Lukasz; 02.07.2010