【发布时间】:2012-03-08 20:54:08
【问题描述】:
我有 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 列对应于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 列)。 fr.uid 部分是必需的,因此返回的结果仅适用于当前用户。查询失败的原因如下:
- 它返回
wp_friends表中的所有行(因为user_login列也匹配),具有wp_friends.uid = 2 - 它返回具有
wp_friends.uid = 2但与wp_users.ID != 2的用户匹配的行
是否可以创建一个查询,该查询将返回选定的列,但也可以防止重复?
【问题讨论】:
-
wp_socialaccess_friends和wp_friends表是相同的 - 只是一个错字。