2012-03-08 3 views
2

У меня есть 3 таблицы:MySQL поиск 3 таблицы с одной таблицей, не связанные непосредственно

  • wp_users - хранит основную информацию о всех пользователей,
  • wp_usermeta - магазины дополнительной информации о пользователях (имя/фамилия/и т.д.)
  • wp_friends - хранит информацию о друзьях от услуг третьих лиц, связанных с конкретным пользователем из wp_users

Если вы не знакомы с WordPress, вы можете увидеть структуру обеих таблиц в http://codex.wordpress.org/images/9/9e/WP3.0-ERD.png

Структура моей пользовательской таблицы wp_friends выглядит следующим образом:

CREATE TABLE wp_friends (
    id bigint(20) unsigned NOT NULL auto_increment, 
    uid bigint(20) unsigned NOT NULL default '0', 
    fr_id VARCHAR (60) NOT NULL default '', 
    service VARCHAR (20) NOT NULL default '', 
    name VARCHAR (80) NOT NULL default '', 
    photo VARCHAR (255) NOT NULL default '', 
    PRIMARY KEY (id), 
    KEY uid (uid), 
    KEY fr_id (fr_id), 
    KEY service (service) 
)` 

колонна uid является соответствует ID колонке в таблице wp_users - вот как я определяю, какая запись соответствует тому пользователю.

Что я пытаюсь сделать, так это создать запрос, который будет выглядеть во всех трех таблицах для соответствия ключевому слову. Вот что я пришел с до сих пор (первая часть была порождена поисковой функцией WordPress):

SELECT 
    wp_users.ID,wp_users.display_name,wp_users.user_login, 
    wp_users.user_email,fr.fr_id,fr.name,fr.photo,fr.service 
    FROM wp_users 

    INNER JOIN wp_usermeta ON (wp_users.ID = wp_usermeta.user_id) 

    LEFT JOIN wp_socialaccess_friends AS fr ON fr.uid = 2 

    WHERE 
    (
     (user_login LIKE '%nik%' OR user_nicename LIKE '%nik%') 
     AND 
     (wp_usermeta.meta_key = 'wp_user_level' AND CAST(wp_usermeta.meta_value AS CHAR) != '0') 
    ) 
    OR (fr.uid = 2 AND (fr.fr_id LIKE '%nik%' OR fr.name LIKE '%nik%')) 

    GROUP BY wp_users.ID,fr.fr_id ORDER BY user_login ASC 

В приведенном выше запросе ключевое слово «НиК» (который также соответствует user_login столбец) , Требуется часть fr.uid, чтобы возвращаемые результаты были доступны только для текущего пользователя. Запрос не выполняется следующим образом:

  • Он возвращает все строки из wp_friends таблицы (потому что user_login столбца соответствует, а), которые имеют wp_friends.uid = 2
  • Он возвращает строки, которые имеют wp_friends.uid = 2 но согласован с пользователями где wp_users.ID != 2

Возможно ли создать один запрос, который будет возвращать выбранные столбцы, но также предотвратит дублирование?

+0

Параметр '' wp_socialaccess_friends' и wp_friends' таблицы одинаковы - просто опечатка там. –

ответ

3

насчет присоединения на суб-выбора, как:

SELECT 
    wp_users.ID,wp_users.display_name,wp_users.user_login, 
    wp_users.user_email 
    FROM wp_users 

    INNER JOIN wp_usermeta ON (wp_users.ID = wp_usermeta.user_id) 
    left join(
     select fr_id, uid,name,photo,service from wp_socialaccess_friends where 
      uid = 2 and 
      (fr_id LIKE '%nik%' OR name LIKE '%nik%') 
     ) AS fr ON wp_users.ID = fr.uid 

    WHERE 
    (
     (user_login LIKE '%nik%' OR user_nicename LIKE '%nik%') 
     AND 
     (wp_usermeta.meta_key = 'wp_user_level' AND CAST(wp_usermeta.meta_value AS CHAR) != '0') 
    ) 

    GROUP BY wp_users.ID,fr.fr_id ORDER BY user_login ASC 
+0

Он выдает мне ошибку 'для правильного синтаксиса для использования рядом 'где uid = 2 и (fr_id LIKE'% nik% 'ИЛИ имя LIKE'% n 'в строке 8' (возможно, потому, что вы пропустили' from'?). Но если я добавлю 'FROM', я получаю' Unknown column 'fr.uid' в разделе on on ', даже если это 'wp_socialaccess_friends.uid' - это не имеет для меня никакого смысла, поскольку столбец правильно выбран ... –

+0

Моя ошибка - я бросился на почту. Обновленный запрос имеет столбец 'uid', добавленный к подвыборке, и я исправил отсутствующий' from'. – Conor

+0

Я добавил 'fr. *' (Те, которые мне нужны) столбцы в 'SELECT', и он отлично работает для возвращения друзей, но он делает это только тогда, когда столбец' ID' соответствует 'uid' AND' user_login'. Я имею в виду, что если я изменил ключевое слово на нечто иное, чем " nik "Я не получу никаких результатов, потому что столбец' user_login' больше не совпадает с этим. Кроме того, поиск больше не возвращает результаты из 'wp_users'. Как я уже сказал, я не совсем уверен, ее то, что я хочу, достижимо в одном запросе - считаете ли вы, что я должен делать два отдельных запроса, а затем сортировать их с помощью PHP? –

Смежные вопросы