从2个表中选择值不适用于连接

时间:2013-07-24 12:00:51

标签: sql

我的数据库中有2个表:

users('user_id', 'name', 'surname', 'email')

和表:

profile('profile_id', 'country')

在我的php脚本中有一个搜索框,用户在其中插入名称,搜索脚本会尝试从我的数据库中选择来自USA的所有名称。知道怎么写sql语句。这就是我所做的,但不起作用。

$sql = " SELECT u.name,u.surname, u.email,u.user_id,p.profile_id FROM users u 
         LEFT JOIN profile p ON p.country = 'uk'
         WHERE ((u.surname LIKE '$name%' AND u.name LIKE '$surname%') OR 
         (u.surname LIKE '$surname%' AND u.name LIKE '$name%')) AND country IS NOT NULL";

我在国家/地区使用了IS NOT NULL,因为有些用户可能没有在他们的个人资料页面中显示他们的国家/地区。

2 个答案:

答案 0 :(得分:1)

除非我遗漏了什么,否则这会有效:

$sql = " SELECT u.name, 
  u.surname, 
  u.email, 
  u.user_id,
  p.profile_id
FROM users u 
    INNER JOIN profile p ON p.country = 'usa'
WHERE ((u.surname LIKE '$name%' AND u.name LIKE '$surname%') OR 
    (u.surname LIKE '$surname%' AND u.name LIKE '$name%'))

INNER JOIN无需IS NOT NULL条件 country现已设置为从usa查找用户而不是uk

基于@Sina的观察,这个查询从一开始就很奇怪。 usersprofile有何关联?如果profile_iduser_id,那么请使联接正常运行 - 如下所示:

INNER JOIN profile p ON p.profile_id = u.user_id AND p.country = 'usa'

答案 1 :(得分:1)

此查询会为所有用户提供国家/地区“uk”的个人资料,因为这是您的加入条件。

如果同一用户的user_id和profile_id相同(例如,如果profile_id = 4的国家/地区为'dk',那么user_id = 4的用户将居住在丹麦),那么您应加入以下内容:

SELECT ...
FROM users u JOIN profile p ON u.user_id = p.profile_id
WHERE ...

如果不是这种情况,那么您不一定要使用JOIN,而只需将其写为where where条件,并将FROM子句中的笛卡尔积作为:

SELECT ...
FROM users u, profile p
WHERE p.country = 'usa'

将联接视为基于共享属性将两个表放在一起的东西。在后一种情况下,没有共享财产。