Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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 - Fatal编程技术网

MySQL-如果所有值都不不同,则显示子表中的空列

MySQL-如果所有值都不不同,则显示子表中的空列,mysql,Mysql,例如,我有以下表格: 发票 ID Name 1 A 2 B 3 C 4 D 5 E 交易 ID Invoice_ID User_ID 1 1 10 2 1 10 3 1 10 4 2 30 5 3 20 6 3 40 7 2 30 8 2 30 9 4

例如,我有以下表格:

发票

ID Name
1   A
2   B
3   C
4   D
5   E
交易

ID  Invoice_ID User_ID
1       1        10
2       1        10
3       1        10
4       2        30
5       3        20
6       3        40
7       2        30
8       2        30
9       4        40
10      3        50
现在我想做一个选择,从相关交易中提取发票和用户id,但是如果我这样做,我当然不会得到所有id,因为它们可能是不同的,但是只有一列。我想做的是,如果有不同的用户ID,我将在列中显示预定义的文本,而不是实际结果

select invoices.id, invoices.name, transactions.user_id(if there are distinct user_ids -> return null)

from invoices
left join transactions on invoices.id = transactions.invoice_id
然后这就是结果

ID Name User_ID
1   A    10
2   B    30
3   C    null
4   D    40
5   E    null

这可能吗?

您可以执行以下操作:

select 
   invoices.id, 
   invoices.name, 
   IF (
      (SELECT COUNT(DISTINCT user_id) FROM transactions WHERE transactions.invoice_id = invoices.id) = 1, 
      (SELECT MAX(user_id) FROM transactions WHERE transactions.invoice_id = invoices.id), 
      null
   ) AS user_id
from invoices
或者,您也可以使用该函数为每个发票输出以逗号分隔的用户列表。这并不完全是你所要求的,但事实上它可能会更有用:

select 
    invoices.id, 
    invoices.name, 
    GROUP_CONCAT(DISTINCT transactions.user_id SEPARATOR ',') AS user_ids
from invoices
left join transactions on invoices.id = transactions.invoice_id
group by invoices.id

您可以执行以下操作:

select 
   invoices.id, 
   invoices.name, 
   IF (
      (SELECT COUNT(DISTINCT user_id) FROM transactions WHERE transactions.invoice_id = invoices.id) = 1, 
      (SELECT MAX(user_id) FROM transactions WHERE transactions.invoice_id = invoices.id), 
      null
   ) AS user_id
from invoices
或者,您也可以使用该函数为每个发票输出以逗号分隔的用户列表。这并不完全是你所要求的,但事实上它可能会更有用:

select 
    invoices.id, 
    invoices.name, 
    GROUP_CONCAT(DISTINCT transactions.user_id SEPARATOR ',') AS user_ids
from invoices
left join transactions on invoices.id = transactions.invoice_id
group by invoices.id
试着做一些事情,比如:

select i.id, i.name, t.user_id
from invoices i left join
(
   select invoice_ID, User_ID
   from transactions
   group by invoice_ID
   having count(invoice_ID)=1
) t on i.id=t.invoice_id

尝试以下方法:

select i.id, i.name, t.user_id
from invoices i left join
(
   select invoice_ID, User_ID
   from transactions
   group by invoice_ID
   having count(invoice_ID)=1
) t on i.id=t.invoice_id

您可以列出具有多个用户ID的所有事务,如下所示:

select invoices.id, invoices.name, null

from invoices
left join transactions on invoices.id = transactions.invoice_id having count(distinct transactions.user_id) > 1
另外,我认为这个
案例
可能适合您的需要:

select invoices.id, invoices.name, 
   case when count(distinct transactions.user_id) > 1 then null else transactions.user_id end     
from invoices
left join transactions on invoices.id = transactions.invoice_id 
group by invoices.id

尽管如此,我不确定这在语法上是否正确

您可以列出具有多个用户ID的所有事务,如下所示:

select invoices.id, invoices.name, null

from invoices
left join transactions on invoices.id = transactions.invoice_id having count(distinct transactions.user_id) > 1
另外,我认为这个
案例
可能适合您的需要:

select invoices.id, invoices.name, 
   case when count(distinct transactions.user_id) > 1 then null else transactions.user_id end     
from invoices
left join transactions on invoices.id = transactions.invoice_id 
group by invoices.id

尽管如此,我不确定这在语法上是否正确

在这种情况下,每次有多个事务时,它都会显示null,对吗?如果我只想在有不同ID的情况下显示“null”怎么办?什么表的不同ID?交易?然后在另一列上按分组,并在与特定发票相关的交易之间对transactions.idies进行计数。就像在我的示例中一样,事务1、2和3都与发票1相关,并且都具有相同的用户id,在本例中,它将显示用户id,因为它们都是相等的。好的,我会尝试这种方法。谢谢第二个答案基本正确<代码>计数(transactions.user\u id)应该是
计数(DISTINCT transactions.user\u id)
<代码>计数不带封闭的
不同的
计数所有非空值,即使这些值相同。感谢所有帮助人员。在这种情况下,每次有多个事务时,它都会显示空值,对吗?如果我只想在有不同ID的情况下显示“null”怎么办?什么表的不同ID?交易?然后在另一列上按分组,并在与特定发票相关的交易之间对transactions.idies进行计数。就像在我的示例中一样,事务1、2和3都与发票1相关,并且都具有相同的用户id,在本例中,它将显示用户id,因为它们都是相等的。好的,我会尝试这种方法。谢谢第二个答案基本正确<代码>计数(transactions.user\u id)应该是
计数(DISTINCT transactions.user\u id)
<代码>计数无附带的
不同的
计数所有非空值,即使这些值相同。感谢所有帮助人员。在这种情况下,如果与发票相关的交易不止一个,则始终显示空值。我只想在这些事务之间存在不同的用户id时显示null。这可能吗?我已经更新了COUNT子查询,这样它将对发票交易的不同用户id进行计数。在这种情况下,如果有多个与发票相关的交易,则始终显示null。我只想在这些事务之间存在不同的用户id时显示null。这可能吗?我已经更新了COUNT子查询,以便它可以计算发票交易的不同用户id