【问题标题】:Query specific case condition查询具体case条件
【发布时间】:2018-12-11 15:54:21
【问题描述】:

正如标题所暗示的,我遇到了一个特定的案例,或者我在这里逐字描述它,然后报告我的表格的逻辑。 例子: 我们承认有一个活动,这个活动有一个客户参加,这个客户可以有1个或多个店铺,参加这个活动。 到目前为止没有什么奇怪的。 在活动页面上,我有一个表格,显示为我的客户订购的整个活动列表,然后如果有人想咨询该活动的详细信息页面,他可以咨询参与该活动的该客户的商店以及所有特征,但我们仍停留在向我显示与客户相关的所有事件的页面上。

我的问题是这样的。

  1. 我创建了一个客户
  2. 我创建一个事件
  3. 我将商店与该事件的客户相关联
  4. 我进入活动页面
  5. 我什么都能看到
  6. 但是如果我从客户表中删除我在(项目 1)注册的客户,与事件相关的整个表将消失。

相反,我希望即使客户被取消,与该客户关联的事件也不会消失,而只是缺少该客户的姓名和姓氏数据。

我用这个简单的例子来说明我的问题是什么,现在我报告表格和下面的查询

客户表名称:clienti

CREATE TABLE `clienti` (
  `cliente_id` int(11) NOT NULL,
  `nome` varchar(255) NOT NULL,
  `cognome` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `telefono` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

事件表的名称:campagne_cliente

CREATE TABLE `campagne_cliente` (
  `id_campagna_cliente` int(11) NOT NULL,
  `cliente_id_campagna` int(11) NOT NULL,
  `impianto_id_campagna` int(11) NOT NULL,
  `nome_campagna_cliente` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

其中 impianto_id_campagna 是产品(商店)的 ID

餐桌活动名称的id和持续时间:campagne

CREATE TABLE `campagne` (
  `id_campagna` int(11) NOT NULL,
  `data_inizio` date NOT NULL,
  `data_fine` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我唯一忽略的部分是商店(产品),因为我不在乎理解为一个例子,这个过程是我已经创建了我所有的产品。

我创建了一个客户,我在客户表中有信息

我创建了一个开始和结束事件,然后去表campagne

将客户与一种或多种产品相关联并转到表campagne_cliente

并使用此查询显示所有内容:

"SELECT DISTINCT nome_campagna_cliente
              , nome
              , cognome
              , telefono
              , email
              , cliente_id
              , data_inizio
              , data_fine
              , id_campagna_cliente
           FROM clienti 
           JOIN campagne_cliente 
             ON campagne_cliente.cliente_id_campagna = clienti.cliente_id
           JOIN campagne 
             ON campagne.id_campagna = campagne_cliente.id_campagna_cliente
             GROUP BY campagne.id_campagna"

现在我在campagne_cliente 表中有一个标准案例

- id_campagna = id of event
- cliente_id_campagna = id of customer
- impianto_id_campagna = id of products

练习示例:

- id_campagna = 10
- cliente_id_campagna = 30
- impianto_id_campagna = 42

如果我去客户表并删除客户 id = 42

使用我上面写的查询,即使 ID 为 42 的客户不再存在,我如何仍然显示其他信息,谢谢

【问题讨论】:

  • 如果你放一些 RIGHT OUTER JOIN 而不是你的 JOIN 会发生什么?
  • @user10600584 你说的我该怎么做?
  • 你自己查询,而不是JOIN campagne_cliente,你写RIGHT OUTER JOIN campagne_cliente。您可能需要为 2 JOIN
  • @user10600584 你相信我不知道该怎么做......对不起,你能把它写成答案吗?有两个连接?
  • 没有问题。每个人都需要从基础开始吧?

标签: php mysql sql inner-join


【解决方案1】:

如果你从客户端删除记录,你需要写:

SELECT DISTINCT nome_campagna_cliente
              , nome
              , cognome
              , telefono
              , email
              , cliente_id
              , data_inizio
              , data_fine
              , id_campagna_cliente
           FROM clienti 
           RIGHT OUTER JOIN campagne_cliente 
             ON campagne_cliente.cliente_id_campagna = clienti.cliente_id
           RIGHT OUTER JOIN campagne 
             ON campagne.id_campagna = campagne_cliente.id_campagna_cliente
             GROUP BY campagne.id_campagna

当你在做的时候,你应该看看外键(尤其是像ON DELETE SET NULL这样的东西)here

干杯

【讨论】:

  • 谢谢大佬,你知道OUTER JOIN这个话题是什么基础的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-04
  • 1970-01-01
  • 2014-01-22
相关资源
最近更新 更多