连接多个表的语法

时间:2014-11-18 22:08:04

标签: mysql sql wordpress join

我需要根据某些WHERE条件查询3个不同表格中的行。

我的表是:

  • 区域
  • 简档
  • usermeta

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"

3 个答案:

答案 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