У меня есть две таблицы t1 и t2, и я хотел бы получить в качестве вывода t1 с добавленным столбцом, дающим количество строк в t2, где присутствуют (id, category).

Вот пример небольшого набора данных:

CREATE TABLE IF NOT EXISTS `t1` (
  `key` int(11) NOT NULL,
  `id` int(11) NOT NULL,
  `category` int(11) NOT NULL,
  PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `t1` (`key`, `id`, `category`) VALUES
(1, 12, 101),
(2, 12, 104),
(3, 13, 102),
(4, 14, 101),
(5, 15, 102);


CREATE TABLE IF NOT EXISTS `t2` (
  `key` int(11) NOT NULL,
  `id` int(11) NOT NULL,
  `category` int(11) NOT NULL,
  PRIMARY KEY (`key`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `t2` (`key`, `id`, `category`) VALUES
(1, 12, 101),
(2, 12, 102),
(3, 13, 101),
(4, 13, 104),
(5, 12, 101),
(6, 15, 102);

Вот результат, который я хочу получить , последний столбец - это желаемая информация:

t1 updated
key, id, category, count_t2_id_category
1, 12, 101, 2     # because (12,101) appears 2 times in t2
2, 12, 104, 0     # because (12,104) appears 0 times in t2
3, 13, 102, 0     # etc
4, 14, 101, 0
5, 15, 102, 1

Я попробовал запустить следующую команду, но в выводе пропущены строки t1:

SELECT *
FROM t1
LEFT OUTER JOIN t2 ON t1.id=t2.id AND t1.category = t2.category
GROUP BY t1.id

Вывод отсутствует ключ t1 # 2:

key id  category    key id  category    
1   12  101 1   12  101 
3   13  102 NULL    NULL    NULL    
4   14  101 NULL    NULL    NULL    
5   15  102 6   15  102 
1
Timothée HENRY 6 Май 2014 в 13:00

2 ответа

Лучший ответ

Поскольку вам нужны нулевые значения для несовпадающих строк, это работа для LEFT JOIN, например:

SELECT 
  t1.*, 
  IF(t2.`key` IS NULL, 0, COUNT(t1.`key`)) AS t2_row_count 
FROM 
  t1 
    LEFT JOIN t2 
      ON t1.id=t2.id 
      AND 
      t1.category=t2.category 
GROUP BY 
  t1.`key`

Мы подсчитываем t1.key, потому что для совпавших строк они будут такими же в первой таблице (а не во второй) - таким образом, мы должны группировать по ней, а не по полям во второй таблице.

Совет : не называйте таблицы / столбцы зарезервированными словами mysql. Это сэкономит вам много времени, если вы случайно забудете обратные кавычки.

1
Alma Do 6 Май 2014 в 09:16

Прежде всего, пожалуйста, измените ключ имени столбца на recid coz key - это зарезервированное слово mysql

ВЫБЕРИТЕ t1.recid, t1.id, t1.category, count (t2.category) как count FROM t1 LEFT JOIN t2 ON t1.id = t2.id И t1.category = t2.category GROUP BY t1.id, t1. категория

0
Strawberry 6 Май 2014 в 09:32