MySQL 3表搜索与一个表没有直接关系


MySQL 3 table search with one table not directly related

我有3个表:

  • CCD_ 1-存储所有用户的主要信息
  • CCD_ 2-存储关于用户的附加信息(名字/姓氏等)
  • 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列对应于wp_users表中的ID列——这就是我确定哪个记录对应于哪个用户的方式。

我要做的是创建一个查询,该查询将在所有三个表中查找与关键字的匹配。以下是我到目前为止得到的(第一部分是由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

在上面的查询中,关键字是"nik"(它也与user_login列匹配)。wp_users0部分是必需的,因此返回的结果仅适用于当前用户。查询以以下方式失败:

  • 它返回wp_friends表中所有具有wp_friends.uid = 2的行(因为user_login列也匹配)
  • 它返回具有wp_friends.uid = 2但与其中wp_users.ID != 2的用户匹配的行

是否可以创建一个查询,返回选定的列,但也可以防止重复?

加入像这样的子选择怎么样

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