Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL选择帮助;子查询?_Mysql_Sql - Fatal编程技术网

MySQL选择帮助;子查询?

MySQL选择帮助;子查询?,mysql,sql,Mysql,Sql,我有两个查询的表。在一个表中,有一些字段表示照片上的球员是否死了/活着,是否在名人堂中,等等。我刚才添加的字段称为“new_flag”。这表示照片对我的库存是否是新的 如果没有群组成员,结果会是这样的(注意一些玩家有不止一个产品/照片) 我的查询是这样的,但是它不能总是找到新的标志,因为每个玩家可能有多条记录 SELECT CONCAT(a.firstname,' ',a.lastname) AS name, a.firstname, a.lastn

我有两个查询的表。在一个表中,有一些字段表示照片上的球员是否死了/活着,是否在名人堂中,等等。我刚才添加的字段称为“new_flag”。这表示照片对我的库存是否是新的

如果没有群组成员,结果会是这样的(注意一些玩家有不止一个产品/照片)

我的查询是这样的,但是它不能总是找到新的标志,因为每个玩家可能有多条记录

SELECT    CONCAT(a.firstname,' ',a.lastname) AS name,
          a.firstname,
          a.lastname,
          b.hall_of_fame,
          b.deceased,
          b.new_flag
 FROM     vm_product_name AS a,
          vm_product_new_attribute AS b  
 WHERE    b.hall_of_fame ='Y'
   AND    a.product_id = b.product_id
 GROUP BY CONCAT(a.firstname,' ',a.lastname)
 ORDER BY a.lastname,
          a.firstname;
问题是,我只希望每个玩家在我的网页上出现一次,但是……如果他们至少有一张新照片,我还希望在玩家的名字旁边添加一个“新”图标。你知道我该怎么做吗


我知道这不是实现这一点的最佳方式,但它是作为Joomla/Virtumart扩展构建的,目前我无法更改数据库结构。

您可能需要一个左连接

SELECT CONCAT(a.firstname, ' ', a.lastname) AS name, a.firstname, a.lastname,
    b.hall_of_fame, b.deceased, MAX(b.new_flag) AS new_flag
FROM vm_product_name AS a
    INNER JOIN vm_product_new_attribute AS b
        ON a.product_id = b.product_id
WHERE b.hall_of_fame = 'Y'
GROUP BY a.lastname, a.firstname
ORDER BY a.lastname, a.firstname
SELECT * FROM (
SELECT CONCAT(vm_product_name.firstname, ' ', vm_product_name.lastname) AS name
vm_product_name.firstname AS firstname, 
vm_product_name.lastname, AS lastname,
vm_product_new_attribute.hall_of_fame AS hall_of_fame,
vm_product_new_attribute.deceased AS deceased, 
vm_product_new_attribute.new_flag AS new_flag
FROM vm_product_name LEFT JOIN vm_product_new_attribute ON vm_product_name.product_id = vm_product_new_attribute.product_id 
ORDER BY lastname, firstname) AS MYRESULT GROUP BY CONCAT(lastname, ' ',firstname);

您可能需要一个左连接来代替

SELECT * FROM (
SELECT CONCAT(vm_product_name.firstname, ' ', vm_product_name.lastname) AS name
vm_product_name.firstname AS firstname, 
vm_product_name.lastname, AS lastname,
vm_product_new_attribute.hall_of_fame AS hall_of_fame,
vm_product_new_attribute.deceased AS deceased, 
vm_product_new_attribute.new_flag AS new_flag
FROM vm_product_name LEFT JOIN vm_product_new_attribute ON vm_product_name.product_id = vm_product_new_attribute.product_id 
ORDER BY lastname, firstname) AS MYRESULT GROUP BY CONCAT(lastname, ' ',firstname);

另外,您可以按多列分组,因此不要在GROUPBY子句中使用CONCAT,只需使用“GROUPBY a.firstname,a.lastname”。避免在GROUP BY(以及WHERE和ORDER BY)子句中使用函数的主要原因是,这将阻止MySQL使用索引,并可能导致它构建一个临时表,这将显著降低查询速度。另外,您可以按多个列分组,因此不要在GROUP BY子句中使用CONCAT,只需使用“groupby a.firstname,a.lastname”。避免在groupby(以及WHERE和ORDER BY)中使用函数的主要原因子句是,它将阻止MySQL使用索引,并可能导致MySQL构建一个临时表,这将显著降低查询速度。左联接完成了什么?空值不联接没有问题。Uhh HELLO!如果表B没有匹配的产品id呢?它将被排除…**这是整个用户都会做的被排除…左连接完成了什么?空值不加入没有问题。Uhh你好!如果表B没有匹配的product_id怎么办?它将被排除…**即整个用户将被排除…+1:但是,例如,如果同一玩家有两行a,并且死者有两个不同的值,它将选择一个of行是任意的。非常感谢!我想是这样。@nate c嗯。有什么办法防止这种情况发生吗?玩家应该有自己的表,没有重复的,但是你上面说你不能控制表。+1:但是,如果有两行a,同一个玩家有两个不同的值,它会选择其中一行是任意的。非常感谢!我想是这样。@nate c嗯。有什么办法防止这种情况发生吗?玩家应该有自己的表,没有重复的,但是你上面说你不能控制表。