【问题标题】:Query: Count how many times a parameter in one table does not exist in another查询:计算一个表中的参数在另一个表中不存在的次数
【发布时间】:2018-12-12 12:57:14
【问题描述】:

作为标题,我有两个表,其中一个是具有相对 id 的产品,一个是在注册后通过内部连接看到涉及不同产品 id 的各种事件的事件之一。 在活动中我可以参与更多产品。

产品表被称为:store_locator

事件表被称为: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 是 store_locator 表(产品)的 ID

这是我的目标。注册活动时,用户将为更多产品选择客户。

一旦完成这个过程,我当然会在事件表中进行

the id of the event
the customer's id
the product id
name of the event: optional
(see Table: campagne_cliente)

实际案例:

  `id_campagna_cliente` = 12
  `cliente_id_campagna` = 34
  `impianto_id_campagna` = 6
  `nome_campagna_cliente` = optional name

显然campagne_cliente表中包含的id号6,是指store_locator表的id号6

这是我的问题: 如果用户不小心从 store_locator 表中删除了数字 6,显然当我去查看该事件的信息页面时,我不会看到产品详细信息数字 6

如何从表 campagne_cliente 中计算 store_locator 表中不存在产品 ID 的次数

我的尝试:

SELECT COUNT(*)
FROM campagne_cliente
RIGHT OUTER JOIN  store_locator
ON  campagne_cliente.impianto_id_campagna = store_locator.id
WHERE store_locator.id = 0 

但不好。

@Alexey

在我的项目中,除了这两个表之外,还有一个表应该涉及到, 我说的那张桌子叫: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;

这个表有一个参数叫:id_campagna 因为这个表存在:因为它允许通过设置开始和结束日期来注册活动(事件),然后在用户将所有产品与客户相关联的下一步中,这些数据最终在表中:campagne_cliente

我也把store_locator表的结构放在里面

CREATE TABLE `store_locator` (
  `id` bigint(20) NOT NULL,
  `user_id` bigint(20) DEFAULT NULL,
  `post_id` bigint(20) DEFAULT NULL,
  `category_id` varchar(11) DEFAULT NULL,
  `name` varchar(160) DEFAULT NULL,
  `logo` varchar(255) DEFAULT NULL,
  `address` varchar(160) DEFAULT NULL,
  `lat` varchar(20) DEFAULT NULL,
  `lng` varchar(20) DEFAULT NULL,
  `url` varchar(160) DEFAULT NULL,
  `description` text,
  `tel` varchar(30) DEFAULT NULL,
  `email` varchar(60) DEFAULT NULL,
  `city` varchar(60) DEFAULT NULL,
  `cap` varchar(255) NOT NULL,
  `country` varchar(60) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `concessionaria` varchar(255) NOT NULL,
  `proprietaria` varchar(255) NOT NULL,
  `cimasa` varchar(255) NOT NULL,
  `inpe` varchar(255) NOT NULL,
  `tipo_impianto` varchar(255) NOT NULL,
  `tipologia` varchar(255) NOT NULL,
  `numero_facce` varchar(255) NOT NULL,
  `quartiere` varchar(255) NOT NULL,
  `comune` varchar(255) NOT NULL,
  `ubicazione` varchar(255) NOT NULL,
  `circuito` varchar(255) NOT NULL,
  `costo_quattordici` varchar(255) NOT NULL,
  `costo_mese` varchar(255) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

还有一个实践例子,这是store_locator表中的value内容,可以看到,没有id 44:

INSERT INTO `store_locator` (`id`, `user_id`, `post_id`, `category_id`, `name`, `logo`, `address`, `lat`, `lng`, `url`, `description`, `tel`, `email`, `city`, `cap`, `country`, `created`, `concessionaria`, `proprietaria`, `cimasa`, `inpe`, `tipo_impianto`, `tipologia`, `numero_facce`, `quartiere`, `comune`, `ubicazione`, `circuito`, `costo_quattordici`, `costo_mese`) VALUES
(1, NULL, NULL, '3x2', NULL, NULL, 'Viale XVII Olimpiade', '41.932294', '12.472014', NULL, NULL, NULL, NULL, 'Roma', '00196', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'AZ830', 'Tradizionale', 'Tradizionale', 'Poster', 'bifacciale', '', 'Roma', '', '', ' € 10.000 ', ' € 20.000 '),
(2, NULL, NULL, '3x2', NULL, NULL, 'Via dei Campi Sportivi, 43', '41.937209', '12.491009', NULL, NULL, NULL, NULL, 'Roma', '00197', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'AZ834', 'Tradizionale', 'Tradizionale', 'Poster', 'monofacciale', 'Monte Antenne', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(3, NULL, NULL, '3x2', NULL, NULL, 'Viale Maresciallo Pilsudski', '41.927768', '12.475042', NULL, NULL, NULL, NULL, 'Roma', '00196', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'AZ837', '', 'Tradizionale', 'Poster', 'monofacciale', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(7, NULL, NULL, '3x2', NULL, NULL, 'Viale XVII Olimpiade', '41.932294', '12.472014', NULL, NULL, NULL, NULL, 'Roma', '00196', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'AZ830', 'Tradizionale', 'Tradizionale', 'Poster', 'bifacciale', '', 'Roma', '', '', ' € 10.000 ', ' € 20.000 '),
(8, NULL, NULL, '3x2', NULL, NULL, 'Via dei Campi Sportivi, 43', '41.937209', '12.491009', NULL, NULL, NULL, NULL, 'Roma', '00197', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'AZ834', 'Tradizionale', 'Tradizionale', 'Poster', 'monofacciale', 'Monte Antenne', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(9, NULL, NULL, '3x2', NULL, NULL, 'Viale Maresciallo Pilsudski', '41.927768', '12.475042', NULL, NULL, NULL, NULL, 'Roma', '00196', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'AZ837', '', 'Tradizionale', 'Poster', 'monofacciale', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(10, NULL, NULL, '3x2', NULL, NULL, 'Viale di Val Fiorita, 25', '41.839818', '12.464565', NULL, NULL, NULL, NULL, 'Roma', '00144', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB106', '', 'Tradizionale', 'Poster', 'monofacciale', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(11, NULL, NULL, '3x2', NULL, NULL, 'Via Salaria, 1075', '41.977152', '12.505168', NULL, NULL, NULL, NULL, 'Roma', '00138', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB608', '', 'Tradizionale', 'Poster', 'monofacciale', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(12, NULL, NULL, '3x2', NULL, NULL, 'Piazzale Aldo Moro', '41.902230', '12.511968', NULL, NULL, NULL, NULL, 'Roma', '00185', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB616', '', 'Tradizionale', 'Poster', 'bifacciale', '', 'Roma', '', '', ' € 10.000 ', ' € 20.000 '),
(13, NULL, NULL, '3x2', NULL, NULL, 'Via Nomentana, 696', '41.937860', '12.540871', NULL, NULL, NULL, NULL, 'Roma', '00141', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB660', '', 'Tradizionale', 'Poster', 'monofacciale', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(14, NULL, NULL, '3x2', NULL, NULL, 'Via Nomentana, 771', '41.937887', '12.544061', NULL, NULL, NULL, NULL, 'Roma', '00137', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB676', '', 'Tradizionale', 'Poster', '', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(15, NULL, NULL, '3x2', NULL, NULL, 'Piazza Ottaviano Vimercati, 37', '41.958539', '12.524797', NULL, NULL, NULL, NULL, 'Roma', '0139', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB708', '', 'Tradizionale', 'Poster', 'bifacciale', '', 'Roma', '', '', ' € 10.000 ', ' € 20.000 '),
(16, NULL, NULL, '3x2', NULL, NULL, 'Via Cavriglia, 10', '41.947661', '12.516421', NULL, NULL, NULL, NULL, 'Roma', '00139', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB708', '', 'Tradizionale', 'Poster', 'monofacciale', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(17, NULL, NULL, '3x2', NULL, NULL, 'Via Monte Rocchetta, 28', '41.947396', '12.531392', NULL, NULL, NULL, NULL, 'Roma', '00139', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB730', '', 'Tradizionale', 'Poster', 'monofacciale', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(18, NULL, NULL, '3x2', NULL, NULL, 'Via Monte Cervialto, 233', '41.956934', '12.523327', NULL, NULL, NULL, NULL, 'Roma', '00139', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB739', '', 'Tradizionale', 'Poster', 'bifacciale', '', 'Roma', '', '', ' € 10.000 ', ' € 20.000 '),
(19, NULL, NULL, '3x2', NULL, NULL, 'Viale Jonio, 185', '41.944706', '12.534701', NULL, NULL, NULL, NULL, 'Roma', '00141', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB753', '', 'Tradizionale', 'Poster', 'bifacciale', '', '', '', '', ' € 10.000 ', ' € 20.000 '),
(20, NULL, NULL, '3x2', NULL, NULL, 'Viale Jonio, 44', '41.944461', '12.543305', NULL, NULL, NULL, NULL, 'Roma', '00141', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB757', '', 'Tradizionale', 'Poster', 'bifacciale', '', 'Roma', '', '', ' € 10.000 ', ' € 20.000 '),
(21, NULL, NULL, '3x2', NULL, NULL, 'Via dei Prati Fiscali, 213', '41.946345', '12.518534', NULL, NULL, NULL, NULL, 'Roma', '00139', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB763', '', 'Tradizionale', 'Poster', 'monofacciale', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(22, NULL, NULL, '3x2', NULL, NULL, 'Via Prenestina, 1072', '41.893370', '12.611979', NULL, NULL, NULL, NULL, 'Roma', '00155', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB827', '', 'Tradizionale', 'Poster', 'monofacciale', '', '', '', '', ' € 5.000 ', ' € 10.000 '),
(23, NULL, NULL, '3x2', NULL, NULL, 'Via Prenestina, 601', '41.893968', '12.583088', NULL, NULL, NULL, NULL, 'Roma', '00155', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB829', '', 'Tradizionale', 'Poster', 'opaco', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(24, NULL, NULL, '3x2', NULL, NULL, 'Via Achille Vertunni, 26', '41.905847', '12.614205', NULL, NULL, NULL, NULL, 'Roma', '00155', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB852', '', 'Tradizionale', 'Poster', 'monofacciale', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(25, NULL, NULL, '3x2', NULL, NULL, 'Via di Tor Tre Teste, 125', '41.877248', '12.588896', NULL, NULL, NULL, NULL, 'Roma', '00169', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB869', '', 'Tradizionale', 'Poster', 'monofacciale', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(26, NULL, NULL, '3x2', NULL, NULL, 'Via Populonia, 36', '41.876673', '12.506151', NULL, NULL, NULL, NULL, 'Roma', '00183', NULL, NULL, 'PUBBLI LEVEL', 'MG Marketing Agency', 'BB969', '', 'Tradizionale', 'Poster', 'monofacciale', '', 'Roma', '', '', ' € 5.000 ', ' € 10.000 '),
(28, NULL, NULL, '3x2', NULL, NULL, 'Via Como 25', '45.5893507', '8.9111801', NULL, NULL, NULL, NULL, 'Milano', '20025', NULL, NULL, 'Adriano Cipriani', 'Adriano Cipriani', 'AC8741', 'AC8741', 'LED', 'Futuristico', '2', 'Legnano', 'Milano', 'Strada', 'Nuovo circuito', '800', '1200'); 

这是campagne_cliente表的内容,你可以看到id 44:

INSERT INTO `campagne_cliente` (`id_campagna_cliente`, `cliente_id_campagna`, `impianto_id_campagna`, `nome_campagna_cliente`) VALUES
(48, 3, 44, ''); 

这是campagne表的内容,可以看到campagne_cliente的id.id_campagna_cliente 48:

INSERT INTO `campagne` (`id_campagna`, `data_inizio`, `data_fine`) VALUES
(48, '2018-12-12', '2018-12-13');

【问题讨论】:

    标签: mysql left-join inner-join outer-join


    【解决方案1】:
    SELECT campagne_cliente.impianto_id_campagna, COUNT(campagne_cliente.impianto_id_campagna)
    FROM campagne_cliente
    WHERE campagne_cliente.impianto_id_campagna NOT IN
        (SELECT store_locator.id FROM store_locator WHERE store_locator.id IS NOT NULL)
    GROUP BY campagne_cliente.impianto_id_campagna
    

    【讨论】:

    • 不,先生,不工作,数不正确,我看不到数字,甚至计数器都没有出来
    • 如果没有断开的关系,它不会给出任何结果。我认为你应该改写你的问题。
    • 为什么要改写,注册完成后,用户可以去产品版块,把用户涉及的产品删掉,我没写好?
    • 这部分写得很好,但问题本身...有多少次某个值不存在于表中。这有点令人困惑:) 它要么存在 N 次,要么不存在(N = 0)。我的查询显示了多少次产品 ID,在产品表中不存在,在活动表中重复。
    • 你是绝对正确的事实上通过阅读你的查询完美地表达了我的问题的意思,但我不明白为什么连计数器都没有初始化,此时我在测试阶段campagne_cliente 表一个 id 为 43 的产品,然后我故意进入 store_locator 表删除了 id 为 43 的产品,但你的查询我不知道你为什么没有显示任何东西
    【解决方案2】:

    试试这个。

    SELECT COUNT(id_campagna_cliente)
    FROM campagne_cliente
    LEFT JOIN  store_locator ON campagne_cliente.impianto_id_campagna = store_locator.id
    WHERE store_locator.id is null
    

    您可能应该强制执行表之间的关系。

    【讨论】:

    • 不,先生,不工作,数不正确,我看不到数字,甚至计数器都没有出来
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2013-07-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 2020-10-23
    相关资源
    最近更新 更多