【发布时间】:2015-01-16 06:35:37
【问题描述】:
我需要根据特定的WHERE 条件从 3 个不同的表中查询行。
我的桌子是:
- 地区
- 个人资料
- 用户元
profiles 表有两个外键,user_id 和 region_id,它们引用了下表。
users 表有一个 id、first_name 和 last_name 列。我还需要为配置文件表中具有 id 的每一行获取 first_name 和 last_name。
regions 表有一个 name 和 id 列。我需要获取配置文件表中具有相应 id 的每个区域的名称。
在配置文件表中,我还有我需要的列 id、certs 和 title。
现在我用三个单独的查询来提取这些,效率太低了。我知道我可以使用 JOINS 来做到这一点,但我不确定语法应该是什么。
更新:
经过你们的大量帮助并进行了一些额外的挖掘,这里是 PHP 和 WordPress 格式的查询的正确代码:
$select_sql = "SELECT p.id, p.title, concat( u1.meta_value, ' ', u2.meta_value ) as fullname, concat( r.name, ', ', c.name ) as location";
$from_sql = "FROM {$modules->tables->profiles} p";
$join_sql = "LEFT JOIN {$wpdb->usermeta} u1 ON p.user_id = u1.user_id AND u1.meta_key = 'first_name'";
$join_sql .= " LEFT JOIN {$wpdb->usermeta} u2 ON p.user_id = u2.user_id AND u2.meta_key = 'last_name'";
$join_sql .= " LEFT JOIN {$modules->tables->regions} r ON r.id = p.region_id";
$join_sql .= " LEFT JOIN {$modules->tables->countries} c ON c.id = p.country_id";
$where_sql = "WHERE p.certification IN ( '%s' ) AND p.country_id IN ( %d )";
$orderby_sql= "ORDER BY p.user_id ASC";
$q = $wpdb->prepare( "{$select_sql} {$from_sql} {$join_sql} {$where_sql} {$orderby_sql}", $certification, $country_id );
$results = $wpdb->get_results( $q );
$q 上的 var_dump 为我们提供了以下 SQL:
string(515) "SELECT p.id, p.title, concat( u1.meta_value, ' ', u2.meta_value ) as fullname, concat( r.name, ', ', c.name ) as location FROM modules_profiles p LEFT JOIN moonlight_usermeta u1 ON p.user_id = u1.user_id AND u1.meta_key = 'first_name' LEFT JOIN moonlight_usermeta u2 ON p.user_id = u2.user_id AND u2.meta_key = 'last_name' LEFT JOIN modules_regions r ON r.id = p.region_id LEFT JOIN modules_countries c ON c.id = p.country_id WHERE p.certification IN ( 'certified' ) AND p.country_id IN ( 2 ) ORDER BY p.user_id ASC"
【问题讨论】:
-
多个
JOINs 的语法与仅一个的语法没有什么不同。