2016-04-18 2 views
1

У меня есть следующие требования.MySQL: Сравнить значения, разделенные запятыми, значениями в разных строках

У меня есть две таблицы T1 и T2, как

Таблица T1

Product  Geography 
P1   G1 
P2   G1 
P2   G2 

Таблица T2

Product  Geography 
P1   G1, G2 
P2   G1, G2 

Я хочу запрос, чтобы получить данные из таблицы T2, если разделенные запятой География имеют точно сопоставление записей в T1. Если в любой таблице меньше или больше географических мест, чем не следует возвращать эту строку. Последовательность географических координат в T2 не фиксирована. Таким образом, возвращение этого запроса из примера выше будет:

Product  Geography 
P2   G1, G2 

ответ

1

Регистрация на concating значения

SELECT t2.Product,t2.geography FROM t2 
JOIN 
(SELECT t1.Product,GROUP_CONCAT(t1.geography ORDER BY t1.Geography SEPARATOR ', ') as concatgeo FROM t1 
GROUP BY t1.product)x 
ON t2.Geography=x.concatgeo AND t2.Product=x.Product 
+1

может быть 'Сепаратор '' 'должен использовать из-за пробела между значениями? – mitkosoft

+1

@mitkosoft Не удалось поймать это, спасибо – Mihai

+0

Последовательность географов в T2 не фиксирована, это могут быть 'G2, G1' или' G1, G3, G2'. Поэтому я не думаю, что ORDER BY в group_concat будет работать для меня. –

0
SELECT 
firstTable.Product, 
firstTable.geographies 
FROM 
(
    SELECT 
    Product, 
    REPLACE(GROUP_CONCAT(Geography),' ','') AS geographies 
    FROM T1 
    GROUP BY Product) firstTable 

INNER JOIN 

(
    SELECT 
    Product, 
    REPLACE(Geography,' ','') AS geographies 
    FROM T2) secondTable 

ON firstTable.Product = secondTable.Product 
WHERE firstTable.geographies = secondTable.geographies; 

Примечание: Я заменил пространства, используя REPLACE функцию только для обеспечения двух запросы из двух таблиц генерируют одну и ту же строку

SQL FIDDLE DEMO

TEST (Если вы не можете получить доступ к sqlfiddle):

DROP TABLE IF EXISTS `t1`; 
CREATE TABLE `t1` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `Product` varchar(50) CHARACTER SET utf8 NOT NULL, 
    `Geography` varchar(100) CHARACTER SET utf8 NOT NULL, 
    PRIMARY KEY (`ID`) 
); 
INSERT INTO `t1` VALUES ('1', 'P1', 'G1'); 
INSERT INTO `t1` VALUES ('2', 'P2', 'G1'); 
INSERT INTO `t1` VALUES ('3', 'P2', 'G2'); 

DROP TABLE IF EXISTS `t2`; 
CREATE TABLE `t2` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `Product` varchar(50) CHARACTER SET utf8 NOT NULL, 
    `Geography` varchar(100) CHARACTER SET utf8 NOT NULL, 
    PRIMARY KEY (`ID`) 
); 
INSERT INTO `t2` VALUES ('1', 'P1', 'G1, G2'); 
INSERT INTO `t2` VALUES ('2', 'P2', 'G1, G2'); 

Запуск выше запрос по этому тестовых данных вы получите выход, как показано ниже:

Product geographies 
P2   G1,G2 
Смежные вопросы