Мне нужна помощь, чтобы получить решение для этого условия. У меня есть таблица, содержащая записи, есть поле sku, в этой записи у меня появляется sku несколько раз. Структура таблицы выглядит так: | id | sku | name
rid is auto_increment, где id – varchar, если какой-либо sku доступен в таблице несколько раз, запись выглядит так:
rid id sku name --- -- ------ -------------- 1 3 rs-123 test product 2 3 rs-123 test product 3 4 rs-125 test product 2 4 4 rs-125 test product 2 5 4 rs-125 test product 2 6 6 rs-126 test product 3
Я использовал этот sql-оператор для получения записей, которые появляются только один раз
SELECT * FROM test GROUP BY id HAVING ( COUNT(id) = 1 )
Это приводит к записям, которые добавляются только один раз, поэтому в соответствии с вышеприведённой записью только 6 – это выход
Я попытался изменить приведенный выше код к этому, чтобы получить результат записей, которые добавляются 2 раза
SELECT * FROM test GROUP BY id HAVING ( COUNT(id) = 2 )
Результат, который я получаю, относится к той записи, которая добавляется 2 раза, но проблема заключается в том, что на выходе появляется только 1 запись;
rid id sku name --- -- ------ ------------ 1 3 rs-123 test product
Мне нужно получить все строки записи, которые добавляются 2 раза в базу данных. Пожалуйста помоги
SELECT t.rid , t.id , t.sku , t.name FROM test t JOIN ( SELECT s.sku FROM test s GROUP BY s.sku HAVING COUNT(1) > 1 ) d ON d.sku = t.sku
Встроенный просмотр с псевдонимом d
возвращает значения sku, которые появляются более одного раза в таблице. Мы можем присоединиться к результатам этого запроса к таблице, чтобы получить все строки, имеющие сов, которое соответствует.
Являются ли id
и sku
взаимозаменяемыми? Это мне было непонятно. (Если id
зависит от sku
а sku
зависит от id
, то вы можете заменить ссылки на sku
со ссылками на id
в этом запросе.
Тестовый дизайн запросов – TDQD – на первый план.
SELECT sku FROM test GROUP BY sku HAVING COUNT(*) > 1
SELECT t.* FROM test AS t JOIN (SELECT sku FROM test GROUP BY sku HAVING COUNT(*) > 1 ) AS s ON t.sku = s.sku
CREATE TABLE test (rid INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,id INT NOT NULL ,sku VARCHAR(12) NOT NULL ,name VARCHAR(20) NOT NULL ); INSERT INTO test VALUES (1,3,'rs-123','test product'), (2,3,'rs-123','test product'), (3,4,'rs-125','test product 2'), (4,4,'rs-125','test product 2'), (5,4,'rs-125','test product 2'), (6,6,'rs-126','test product 3'); SELECT x.* FROM test x JOIN test y ON y.id = x.id GROUP BY x.rid HAVING COUNT(*) > 1; +-----+----+--------+----------------+ | rid | id | sku | name | +-----+----+--------+----------------+ | 1 | 3 | rs-123 | test product | | 2 | 3 | rs-123 | test product | | 3 | 4 | rs-125 | test product 2 | | 4 | 4 | rs-125 | test product 2 | | 5 | 4 | rs-125 | test product 2 | +-----+----+--------+----------------+ 5 rows in set (0.01 sec)
Этот запрос должен работать на вас:
SELECT * FROM test WHERE id IN(SELECT id FROM test group by id HAVING count(id) > 1)
Когда вы группируете Id
вы не можете получить более одного идентификатора в группе, поэтому COUNT(Id)
всегда 1. Используйте это вместо
SELECT * FROM test GROUP BY id HAVING ( COUNT(sku) = 2 )
Если вы хотите, чтобы все записи с несколькими дублирующими sku
использовали это:
SELECT * FROM test GROUP BY id HAVING ( COUNT(sku) > 1 )