0

我的数据库中有 2 个表:

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

和表:

profile('profile_id', 'country')

在我的 php 脚本中有一个搜索框,用户可以在其中插入姓名,并且搜索脚本会尝试从我的数据库中选择来自美国的所有姓名。知道如何编写 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 作为国家,因为有些用户可能没有在他们的个人资料页面中填写他们的国家。

4

2 回答 2

1

此查询将为您提供具有国家“英国”个人资料的所有用户,因为这是您的加入条件。

如果同一用户的 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 ...

如果不是这种情况,那么您不必使用 aJOIN而是将其写为 where 条件,并让FROM子句中的笛卡尔积像:

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

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

于 2013-07-24T12:13:29.327 回答
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设置为countryusa不是uk.

根据@Sina 的观察,这个查询从一开始就很奇怪。怎么做usersprofile关联?如果profile_iduser_id,则使连接正常工作 - 如下所示:

INNER JOIN profile p ON p.profile_id = u.user_id AND p.country = 'usa'
于 2013-07-24T12:09:32.163 回答