我需要根据某些WHERE
条件查询3个不同表格中的行。
我的表是:
profiles表有两个外键,user_id和region_id,它们引用了下面的表。
users表具有id,first_name和last_name列。我还需要为配置文件表中具有id的每一行获取first_name和last_name。
区域表有一个名称和id列。我需要获取配置文件表中具有相应ID的每个区域的名称。
在配置文件表中,我还有我需要的列id,证书和标题。
现在我用三个单独的查询来提取这些问题是非常低效的。我知道我可以用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"
答案 0 :(得分:0)
连接的语法如下所示:
SELECT stuff
FROM firstTable
JOIN secondTable ON firstTable.someColumn = secondTable.matchingColumn
在这种情况下,我还建议使用表别名(只需在表名就足够后添加别名)。这只是朝着正确方向的简单推动:
SELECT columnsYouNeed
FROM users u
JOIN profiles p ON p.user_id = u.id
JOIN regions r ON r.id = p.region_id;
这是您正在寻找的语法,我将挑战您正确输入列并添加您可能需要的任何WHERE子句。如果你仍然被困住,请随时提问。
答案 1 :(得分:0)
在所有表格之间执行JOIN
。以下查询是汇总您在帖子中提供的信息
select users.first_name,
users.last_name,
regions.name,
profiles.id,
profiles.certs,
profiles.title
from users
left join profiles on profiles.user_id = users.id
left join region on profiles.region_id = regions.id;
答案 2 :(得分:0)
正如您所说的使用JOIN
以下是基于用户可能必须拥有个人资料或地区的假设的查询。
SELECT users.first_name, users.last_name, regions.name, profiles.id, profiles.certs, profiles.title
FROM users
LEFT JOIN profiles ON profiles.user_id = users.id
LEFT JOIN regions ON regions.id = profiles.region_id
如果他们总是这样做,或者您只想要那些有个人资料和地区的人,那么您可以将其更改为INNER JOIN