查询特定案例条件

时间:2018-12-11 15:54:21

标签: php mysql sql inner-join

正如标题所示,我遇到了一个具体案例,或者在这里我都逐字描述了两者,然后报告了表的逻辑。 例: 我们承认有一个活动,一位顾客参加了此活动,并且该顾客可以有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

表事件名称的名称和持续时间: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;

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

我创建了一个客户,并且在clienti表中有该信息

我创建了一个开始和结束事件,然后转到活动表

将客户与一种或多种产品相关联,然后转到表格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

如果我转到clienti表并删除客户ID = 42

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

1 个答案:

答案 0 :(得分:0)

如果您从clienti中删除记录,则需要输入:

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 NULLhere

欢呼