Найдите повторяющиеся записи с расширенным запросом в CodeIgniter Datamapper

Я пытаюсь получить все повторяющиеся строки из БД. Допустим, у меня есть таблица entries с первичным ключом id и столбцом VARCHAR с именем name. У меня уже есть рабочий SQL-запрос:

SELECT id, entries.name FROM entries 
INNER JOIN 
    (SELECT name FROM entries 
     GROUP BY name 
     HAVING count(id) > 1) 
duplicate ON entries.name = duplicate.name

Я хотел бы создать аналогичный запрос с библиотекой CodeIgniter Datamapper для личного интереса, а также для обеспечения согласованности с остальной частью кода.

Я построил часть подзапроса, и она работает так, как ожидалось:

$e = new Entry();
$e->group_by('name')->having('COUNT(id) > 1')->get();

Но я не могу понять, как интегрировать подзапрос в родительский запрос (часть INNER JOIN ... ON ...).


person package    schedule 23.02.2012    source источник


Ответы (1)


Во-первых, вам не нужно использовать внутреннее соединение.

ВЫБЕРИТЕ идентификатор, записи.имя ИЗ записей СГРУППИРОВАТЬ ПО имени ИМЕЕТ количество (идентификатор) › 1

Это даст вам дубликаты записей. Таким образом, вам не нужно будет создавать сопоставление данных для объединенного запроса.

Только этим вы получите результат.

$e = новая запись();

$e-›group_by('name')-›having('COUNT(id) › 1')-›get();

Обновлять:

ВЫБЕРИТЕ идентификатор, записи.имя ИЗ записей, где идентификатор НЕ ВХОДИТ (ВЫБЕРИТЕ идентификатор ИЗ записей, СГРУППИРОВАТЬ ПО имени, ИМЕЮЩЕМУ количество (идентификатор) = 1)

person Somnath Muluk    schedule 27.02.2012
comment
Если бы у нас было 3 строки в таблице, например: 1 John Doe, 2 John Doe, 3 Jane Doe, этот подзапрос вернул бы мне только одну строку (1 John Doe). Он находит повторяющееся значение, но не возвращает все дубликаты. - person package; 27.02.2012
comment
Спасибо, этот работает. Хотя производительность на очень маленькой таблице в 2 раза хуже по сравнению с inner join. Я проведу несколько экспериментов. Я награжу вас, если в течение пары дней не будет лучшего ответа. - person package; 27.02.2012