从两个表中选择每个具有不同连接的表

时间:2016-01-25 18:48:21

标签: mysql

尝试运行此查询不会返回任何错误,但我猜它仍然有问题。运行四分钟后,它一直在详细说明:

SELECT DISTINCT azioni_row.id_az, sofferenze.Descrizione, COUNT(crediti.stato = 'aperta') as aperti, COUNT(crediti.stato = 'chiusa') as chiusi
FROM (`azioni_row`, sofferenze) 
JOIN crediti ON azioni_row.id_cred=crediti.id_cre 
JOIN azioni_head as ah1 ON azioni_row.id_az=ah1.id_az
JOIN azioni_head as ah2 ON ah2.id_soff = sofferenze.id_soff
GROUP BY id_az  
ORDER BY `azioni_row`.`id_az` ASC

如果我从选择列表中删除sofferenze.Descrizione并从FROM列表进行sofferenze,它会在几秒钟内运行:

SELECT DISTINCT azioni_row.id_az, COUNT(crediti.stato = 'aperta') as aperti, COUNT(crediti.stato = 'chiusa') as chiusi
FROM azioni_row 
JOIN crediti ON azioni_row.id_cred=crediti.id_cre 
JOIN azioni_head as ah1 ON azioni_row.id_az=ah1.id_az
GROUP BY id_az  
ORDER BY `azioni_row`.`id_az` ASC

我想显示Descrizione字段,但它的链接位于head表中,而不是第一行。头与行之间的关系是一对多的。我将所有不需要重复的信息存储在每一行中,与Descrizione的链接就是其中一个。

编辑: 这是解释: enter image description here

这是azioni_head的创建:

CREATE TABLE `azioni_head` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `tipo` varchar(2) NOT NULL,
 `id_az` varchar(11) NOT NULL,
 `id_soff` varchar(11) NOT NULL,
 `id_soff_gar` varchar(11) DEFAULT NULL,
 `date_from` date NOT NULL,
 `date_to` date NOT NULL,
 `close_why` int(11) NOT NULL,
 `RGE` varchar(30) NOT NULL,
 `procedente` varchar(2) NOT NULL,
 `curatore` varchar(11) NOT NULL,
 `legale` varchar(11) NOT NULL,
 `tribunale` varchar(11) NOT NULL,
 `riparto` varchar(2) NOT NULL DEFAULT '0',
 `perc_worst` decimal(13,10) NOT NULL,
 `perc_best` decimal(13,10) NOT NULL,
 `perc_poster` decimal(13,10) NOT NULL,
 `attivo_storico` decimal(65,2) NOT NULL,
 `passivo_storico` decimal(65,2) NOT NULL,
 `attivo_storico_comm` decimal(65,2) NOT NULL,
 `passivo_storico_comm` decimal(65,2) NOT NULL,
 `acconti` decimal(65,2) NOT NULL,
 `acconti_comm` decimal(65,2) NOT NULL,
 `numero_comm` int(11) NOT NULL,
 `legali_worst` decimal(65,2) NOT NULL,
 `legali_best` decimal(65,2) NOT NULL,
 `manuale` tinyint(1) NOT NULL DEFAULT '0',
 `created_by` int(11) NOT NULL,
 `created_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1449 DEFAULT CHARSET=utf8 COMMENT='tabella testata azioni'

这对于azioni_row:

CREATE TABLE `azioni_row` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `id_az` varchar(11) NOT NULL,
 `id_cred` varchar(11) NOT NULL,
 `chiesto` decimal(65,2) NOT NULL,
 `ammesso` decimal(65,2) NOT NULL,
 `data_ammesso` date NOT NULL,
 `rango_ammesso` tinytext NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4479 DEFAULT CHARSET=utf8

这适用于sofferenze

CREATE TABLE `sofferenze` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `id_soff` varchar(11) NOT NULL,
 `Descrizione` tinytext NOT NULL,
 `gruppo` int(11) NOT NULL,
 `cointestazione` int(11) NOT NULL,
 `port_man` tinytext NOT NULL,
 `head_port_man` tinytext NOT NULL,
 `note` longtext NOT NULL,
 `created_on` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 `created_by` int(11) NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `id` (`id`),
 UNIQUE KEY `id_3` (`id`),
 KEY `id_2` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1716 DEFAULT CHARSET=utf8

1 个答案:

答案 0 :(得分:0)

请提供正确的CREATE语句以及输出:

EXPLAIN
SELECT a.id_az
     , s.Descrizione
     , COUNT(c.stato = 'aperta') aperti
     , COUNT(c.stato = 'chiusa') chiusi
  FROM azioni_row a
  JOIN sofferenze s
 CROSS
  JOIN crediti c
    ON c.id_cre = a.id_cred
  JOIN azioni_head ah1 
    ON ah1.id_az = a.id_az
  JOIN azioni_head ah2 
    ON ah2.id_soff = s.id_soff 
 GROUP 
    BY a.id_az  
     , s.Descrizione
 ORDER 
    BY a.id_az ASC

编辑:您似乎在同一列上有很多索引。删除除PRIMARY KEY之外的所有索引,并创建以下索引:

sofferenze: id_soff
azioni_row: try a composite index on (id_az,id_cred)
azioni_head: an index on id_soff and an index on id_az

缺少Crediti,所以我不能评论那个。