Mysql 计算左联接的结果只返回1行

Mysql 计算左联接的结果只返回1行,mysql,sql,Mysql,Sql,我有一个用户表和另一个提交网站表。我想选择所有用户,无论他们是否在网站表中有网站。如果他们这样做了,我想在我的PHP脚本中使用它们 我的问题是: SELECT u.user_country, u.user_id, u.user_email, u.user_verified, c.country_iso, c.country_nicename, count(distinct w.website_id) as websiteco

我有一个用户表和另一个提交网站表。我想选择所有用户,无论他们是否在网站表中有网站。如果他们这样做了,我想在我的PHP脚本中使用它们

我的问题是:

SELECT 
    u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename,  
    count(distinct w.website_id) as websitecount
FROM user u
LEFT JOIN country c
    ON c.country_id = u.user_country
LEFT JOIN websites w
    ON w.website_owner = u.user_id 
我的用户表:

CREATE TABLE `user` (
  `user_id` bigint(20) NOT NULL,
  `user_username` varchar(50) NOT NULL,
  `user_email` varchar(255) NOT NULL,
  `user_firstname` varchar(50) NOT NULL,
  `user_surname` varchar(50) NOT NULL,
  `user_country` varchar(100) NOT NULL,
  `user_password` varchar(255) NOT NULL,
  `user_verified` varchar(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
我的网站表

CREATE TABLE `websites` (
  `website_id` bigint(20) NOT NULL,
  `website_name` varchar(75) NOT NULL,
  `website_url` varchar(255) NOT NULL,
  `website_type` varchar(10) NOT NULL,
  `website_verified` varchar(10) NOT NULL,
  `website_owner` bigint(20) NOT NULL,
  `website_adult_content` varchar(3) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

现在,当我从SQL中删除
count(distinct w.website\u id)作为websitecount
时,它会选择它应该选择的所有行。但如果输入,它只选择1。我正在尝试选择全部。

您确实需要在此处使用
分组:

SELECT 
    u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename,  
    count(distinct w.website_id) as websitecount
FROM user u
LEFT JOIN country c
    ON c.country_id = u.user_country
LEFT JOIN websites w
    ON w.website_owner = u.user_id 
group by u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename

如果您没有包含
GROUPBY
子句,并且您正在使用聚合函数,MySQL将任意选择一条记录返回。一个
group by
基本上是说“给我这些东西的所有组合”,如果你没有,MySQL不知道你想要什么,但也不会告诉你。如果没有
group by
,其他RDBMS甚至不允许您运行查询,但出于某种原因,MySQL提供了在查询中未包含此子句时是否需要提醒的选项。有关更多信息,请参见。

您确实需要使用
分组方式,请参见此处:

SELECT 
    u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename,  
    count(distinct w.website_id) as websitecount
FROM user u
LEFT JOIN country c
    ON c.country_id = u.user_country
LEFT JOIN websites w
    ON w.website_owner = u.user_id 
group by u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename

如果您没有包含
GROUPBY
子句,并且您正在使用聚合函数,MySQL将任意选择一条记录返回。一个
group by
基本上是说“给我这些东西的所有组合”,如果你没有,MySQL不知道你想要什么,但也不会告诉你。如果没有
group by
,其他RDBMS甚至不允许您运行查询,但出于某种原因,MySQL提供了在查询中未包含此子句时是否需要提醒的选项。有关详细信息,请参阅。

看起来您缺少分组依据。您需要在count中为相同的列指定所需的内容

SELECT 
    u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename,  
    count(distinct w.website_id) as websitecount
FROM user u
LEFT JOIN country c
    ON c.country_id = u.user_country
LEFT JOIN websites w
    ON w.website_owner = u.user_id
GROUP BY 
    u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename
注:如果您需要不同的网站数量,上述查询应该是好的

如果您正在查找所有网站计数(即有重复项),则需要删除不同的

SELECT 
    u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename,  
    count(w.website_id) as websitecount
FROM user u
LEFT JOIN country c
    ON c.country_id = u.user_country
LEFT JOIN websites w
    ON w.website_owner = u.user_id
GROUP BY 
    u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename

看来你错过了分组。您需要在count中为相同的列指定所需的内容

SELECT 
    u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename,  
    count(distinct w.website_id) as websitecount
FROM user u
LEFT JOIN country c
    ON c.country_id = u.user_country
LEFT JOIN websites w
    ON w.website_owner = u.user_id
GROUP BY 
    u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename
注:如果您需要不同的网站数量,上述查询应该是好的

如果您正在查找所有网站计数(即有重复项),则需要删除不同的

SELECT 
    u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename,  
    count(w.website_id) as websitecount
FROM user u
LEFT JOIN country c
    ON c.country_id = u.user_country
LEFT JOIN websites w
    ON w.website_owner = u.user_id
GROUP BY 
    u.user_country, 
    u.user_id, 
    u.user_email, 
    u.user_verified, 
    c.country_iso, 
    c.country_nicename

您缺少一个
分组依据
。您缺少
分组依据
。我知道mysql允许它(天知道为什么),但你真的应该使用它it@Lamak,如果它丢失了怎么办?按所有需要的列分组,或者只是一些不可预测的事情?@jarlh说实话,我不知道,因为我不使用mysql。但是我推测,op所说的就是发生的事情,它返回了一行带有某个值的数据。您缺少了一个
分组依据
。您缺少了
分组依据
。我知道mysql允许它(天知道为什么),但你真的应该使用它it@Lamak,如果它丢失了怎么办?按所有需要的列分组,或者只是一些不可预测的事情?@jarlh说实话,我不知道,因为我不使用mysql。但我想发生的事情就是op所说的,它返回一行带有某个值的数据