PHP MySQL Group BY 有问题
PHP MySQL Group BY Having issue
假设我有一个 table 比如:
ID|Word |Reference
1 |Dog |1
1 |Fish |2
1 |Sheep|3
2 |Dog |4
2 |Fish |5
3 |Sheep|6
4 |Dog |7
我想要 select 所有 ID 包含单词 Dog AND Sheep。所以结果应该是 ID:1 和 2。我尝试使用这个查询:
SELECT ID FROM `Table` WHERE Word='Dog' OR Word='Fish' GROUP BY ID Having Word='Dog AND Word='Fish'
但是,Having
子句中的这个 AND
让我得到 0 个结果。那么,我是在做错什么,还是有另一种方法可以仅基于 MySQL 查询来实现我想要的效果(以优化速度,因为它必须使用与上例相同的设置搜索许多行)
基本上问题是对具有相同 ID 的多行的 AND 语句。
更新:
我需要获取找到的 ID 的参考。例如。当返回 ID 1 和 2 时,我需要知道 ID 1 具有引用 1 和 2。ID 2 具有引用 3 和 4。目前,我正在使用此查询:
SELECT ID FROM `Test` WHERE Word in ('Dog', 'Fish') GROUP BY ID HAVING count(DISTINCT Word) = 2;
谢谢
您需要自己加入table。通过这种方式,您可以在狗和羊重叠的情况下找出 id 相同的地方。
试试这个:
declare @t table (id int , Word varchar(10) )
insert into @t (ID, Word) values (1, 'Dog'),
(1 ,'Fish'),
(1 ,'Sheep'),
(2 ,'Dog'),
(2 ,'Sheep'),
(3 ,'Sheep'),
(4 ,'Dog')
select t.ID
from @t as t
join @t as t1 on t1.id = t.id
where t.word = 'Dog' and t1.word = 'Sheep'
这是一种方法,可以将您的 table 加入自身。
SELECT t1.id FROM `Table` t1
INNER JOIN `Table` t2 ON t1.id = t2.id
WHERE t1.word='Dog' AND t2.word='Sheep';
我的问题的答案是使用下面的查询解决的:
SELECT ID, GROUP_CONCAT(Reference) as ReferencesGrouped FROM `Test` WHERE Word in ('Dog', 'Fish') GROUP BY ID HAVING count(DISTINCT Word) = 2;
这将 return 我:
ID|ReferencesGrouped
1 |1,4
2 |4,5
这里有两个 return 正确记录的解决方案,第一个是按 ID 和参考文献作为单独的记录,第二个是每个 ID 一个记录,单词和参考文献以逗号分隔在列中。
设置 table 并填充行:
DROP TABLE IF EXISTS `list1`;
CREATE table `list1` (
id int(10),
Word varchar(10),
Reference int(10)
);
INSERT INTO `list1` (`ID`, `Word`, `Reference`)
VALUES
(1, 'Dog',1),
(1 ,'Fish',2),
(1 ,'Sheep',3),
(2 ,'Dog',4),
(2 ,'Sheep',5),
(3 ,'Sheep',6),
(4 ,'Dog',7);
Returns ID和Word的每个组合一行
SELECT
t.`ID`,
t.`Word`,
t.`Reference`
FROM `list1` as t
JOIN (
SELECT
t1.`ID` as `ref_id`
FROM `list1` AS t1
WHERE `Word` in ('Sheep','Dog')
GROUP BY t1.`ID`
HAVING count(DISTINCT t1.`Word`) = 2
) AS ts
ON t.`ID` = ts.`ref_id`
WHERE t.`Word` in ('Sheep','Dog')
ORDER BY t.`ID`,t.`Word`;
结果
ID | Word | Reference
1 | Dog | 1
1 | Sheep | 3
2 | Dog | 4
2 | Sheep | 5
Returns 每个 ID 一行,一列以逗号分隔的单词列表,另一列以逗号分隔的引用列表。
SELECT
t.`ID`,
GROUP_CONCAT(t.`Word`) AS `Words`,
GROUP_CONCAT(t.`Reference`) AS `References`
FROM `list1` as t
JOIN (
SELECT
t1.`ID` as `ref_id`
FROM `list1` AS t1
WHERE `Word` in ('Sheep','Dog')
GROUP BY t1.`ID`
HAVING count(DISTINCT t1.`Word`) = 2
) AS ts
ON t.`ID` = ts.`ref_id`
WHERE t.`Word` in ('Sheep','Dog')
GROUP BY t.`ID`
ORDER BY t.`ID`,t.`Word`;
结果:
ID | Words | References
1 | Dog,Sheep | 1,3
2 | Dog,Sheep | 4,5
假设我有一个 table 比如:
ID|Word |Reference
1 |Dog |1
1 |Fish |2
1 |Sheep|3
2 |Dog |4
2 |Fish |5
3 |Sheep|6
4 |Dog |7
我想要 select 所有 ID 包含单词 Dog AND Sheep。所以结果应该是 ID:1 和 2。我尝试使用这个查询:
SELECT ID FROM `Table` WHERE Word='Dog' OR Word='Fish' GROUP BY ID Having Word='Dog AND Word='Fish'
但是,Having
子句中的这个 AND
让我得到 0 个结果。那么,我是在做错什么,还是有另一种方法可以仅基于 MySQL 查询来实现我想要的效果(以优化速度,因为它必须使用与上例相同的设置搜索许多行)
基本上问题是对具有相同 ID 的多行的 AND 语句。
更新:
我需要获取找到的 ID 的参考。例如。当返回 ID 1 和 2 时,我需要知道 ID 1 具有引用 1 和 2。ID 2 具有引用 3 和 4。目前,我正在使用此查询:
SELECT ID FROM `Test` WHERE Word in ('Dog', 'Fish') GROUP BY ID HAVING count(DISTINCT Word) = 2;
谢谢
您需要自己加入table。通过这种方式,您可以在狗和羊重叠的情况下找出 id 相同的地方。 试试这个:
declare @t table (id int , Word varchar(10) )
insert into @t (ID, Word) values (1, 'Dog'),
(1 ,'Fish'),
(1 ,'Sheep'),
(2 ,'Dog'),
(2 ,'Sheep'),
(3 ,'Sheep'),
(4 ,'Dog')
select t.ID
from @t as t
join @t as t1 on t1.id = t.id
where t.word = 'Dog' and t1.word = 'Sheep'
这是一种方法,可以将您的 table 加入自身。
SELECT t1.id FROM `Table` t1
INNER JOIN `Table` t2 ON t1.id = t2.id
WHERE t1.word='Dog' AND t2.word='Sheep';
我的问题的答案是使用下面的查询解决的:
SELECT ID, GROUP_CONCAT(Reference) as ReferencesGrouped FROM `Test` WHERE Word in ('Dog', 'Fish') GROUP BY ID HAVING count(DISTINCT Word) = 2;
这将 return 我:
ID|ReferencesGrouped
1 |1,4
2 |4,5
这里有两个 return 正确记录的解决方案,第一个是按 ID 和参考文献作为单独的记录,第二个是每个 ID 一个记录,单词和参考文献以逗号分隔在列中。
设置 table 并填充行:
DROP TABLE IF EXISTS `list1`;
CREATE table `list1` (
id int(10),
Word varchar(10),
Reference int(10)
);
INSERT INTO `list1` (`ID`, `Word`, `Reference`)
VALUES
(1, 'Dog',1),
(1 ,'Fish',2),
(1 ,'Sheep',3),
(2 ,'Dog',4),
(2 ,'Sheep',5),
(3 ,'Sheep',6),
(4 ,'Dog',7);
Returns ID和Word的每个组合一行
SELECT
t.`ID`,
t.`Word`,
t.`Reference`
FROM `list1` as t
JOIN (
SELECT
t1.`ID` as `ref_id`
FROM `list1` AS t1
WHERE `Word` in ('Sheep','Dog')
GROUP BY t1.`ID`
HAVING count(DISTINCT t1.`Word`) = 2
) AS ts
ON t.`ID` = ts.`ref_id`
WHERE t.`Word` in ('Sheep','Dog')
ORDER BY t.`ID`,t.`Word`;
结果
ID | Word | Reference
1 | Dog | 1
1 | Sheep | 3
2 | Dog | 4
2 | Sheep | 5
Returns 每个 ID 一行,一列以逗号分隔的单词列表,另一列以逗号分隔的引用列表。
SELECT
t.`ID`,
GROUP_CONCAT(t.`Word`) AS `Words`,
GROUP_CONCAT(t.`Reference`) AS `References`
FROM `list1` as t
JOIN (
SELECT
t1.`ID` as `ref_id`
FROM `list1` AS t1
WHERE `Word` in ('Sheep','Dog')
GROUP BY t1.`ID`
HAVING count(DISTINCT t1.`Word`) = 2
) AS ts
ON t.`ID` = ts.`ref_id`
WHERE t.`Word` in ('Sheep','Dog')
GROUP BY t.`ID`
ORDER BY t.`ID`,t.`Word`;
结果:
ID | Words | References
1 | Dog,Sheep | 1,3
2 | Dog,Sheep | 4,5