0

我正在为我的项目扩展用户配置文件,添加更多信息。当我遇到问题时,我只是在添加国家/地区。这是我选择所需的所有配置文件数据的查询:

SELECT c.*, d.username, d.email, e.country_name
    FROM user_profiles c, users d, country e
    WHERE c.user_id = ".$id." AND d.id = ".$id."
    AND e.country_name = (SELECT country_name FROM country WHERE id = c.country_id)

c.* 应该从 user_profiles 中选择所有列。

$id是一个用户选择应该返回的配置文件的 id。问题是,尽可能保持注册简单,我那里没有国家选择器。所以当这个查询起作用时,user_profiles 中的 country_id 列是空的,这意味着当我想返回 country_name 时,查询结果是空的,所以没有返回配置文件数据。

我试图用CASEor重写它LEFT JOIN,但我认为我遗漏了一些东西。我想查找 country_id 是否不为空,如果不为空,请同时选择country_namethis country_id。有任何想法吗?

感谢您的回复。

4

2 回答 2

0

您可以使用 a ,但如果您从使用更简洁、更现代的语法LEFT JOIN开始,这样做会容易得多:JOIN

SELECT c.*, d.username, d.email, e.country_name
FROM user_profiles c 
JOIN users d ON d.id = c.id 
JOIN country e ON e.country_id = c.country_id
WHERE c.user_id = 42

现在要解决您的问题,您只需添加LEFT

LEFT JOIN country e ON e.country_id = c.country_id

完整查询:

SELECT c.*, d.username, d.email, e.country_name
FROM user_profiles c 
JOIN users d ON d.id = c.id 
LEFT JOIN country e ON e.country_id = c.country_id
WHERE c.user_id = 42

有关的

于 2012-12-23T00:34:08.270 回答
-1

在我开始考虑您当前的问题之前,我可以指出您当前的查询是一团糟。特别糟糕。它可能会起作用,甚至可能会有效地起作用——但它仍然是一团糟:

SELECT c.*, d.username, d.email, e.country_name
FROM user_profiles c, users d, country e
WHERE d.id = ".$id." 
AND d.id = c.user_id
AND e.id = c.country_id;

我试图用 CASE 或 LEFT JOIN 重写它

但你不会向我们展示你的代码吗?

一种解决方案是对 user_profiles/users 中的每一行使用子选择:

SELECT c.*, d.username, d.email, 
   (SELECT e.country_name
    FROM country e
    WHERE AND e.id = c.country_id LIMIT 0,1) AS country_name
FROM user_profiles c, users d
WHERE d.id = ".$id." 
AND d.id = c.user_id;

或者,使用 LEFT JOIN:

SELECT c.*, d.username, d.email, e.country_name
FROM user_profiles c
INNER JOIN users d
   ON d.id = c.user_id
LEFT JOIN country e
   ON e.id = c.country_id
WHERE d.id = ".$id.";
于 2012-12-23T00:41:30.857 回答