Поиск дублей в базе данных

iccup
На сайте с 01.05.2016
Offline
116
578

Есть база dle, `dle_post` таблица, структура там следующая

(`id`, `autor`, `date`, `short_story`, `full_story`, `xfields`, `title`, `descr`, `keywords`, `category`, `alt_name`, `comm_num`, `allow_comm`, `allow_main`, `approve`, `fixed`, `allow_br`, `symbol`, `tags`, `metatitle`)

В общем надо найти дубли в столбце `alt_name`, и выгрузить в виде просто `id`, ну, или можно даже и строки полностью со всей структурой. Главное мне нужны ID этих новостей. Как составить запрос?

kimsufi.com (https://www.kimsufi.com) очень дешевые и качественные дедики
D
На сайте с 18.12.2015
Offline
147
#1

Как-то так


SELECT `id` -- или любые другие строки
FROM `dle_post`
WHERE `alt_name` IN (
SELECT `alt_name`
FROM `dle_post`
GROUP BY `alt_name`
HAVING COUNT(*) > 1
)
Разработка и поддержка высоконагруженных проектов.
iccup
На сайте с 01.05.2016
Offline
116
#2

я так понял, когда в базе около 1,5 млн строк, то это может занять некоторое время) у меня сейчас 504 ошибку выбивает. Что можно предпринять?

HM
На сайте с 14.01.2012
Offline
215
#3

iccup, запускать из консольного клиента mysql.

D
На сайте с 18.12.2015
Offline
147
#4

Или добавить индекс а потом дропнуть.

iccup
На сайте с 01.05.2016
Offline
116
#5
danforth:
Или добавить индекс а потом дропнуть.

а вот тут можно подробнее, я уже так делал, ну, как-то так что удалилась полбазы)

---------- Добавлено 05.04.2019 в 09:08 ----------

hakuna matata:
iccup, запускать из консольного клиента mysql.

а куда все это дело потом сохраняется?

orlov90
На сайте с 21.03.2019
Offline
1
#6

iccup, php-скрипт сделайте и запустите на localhost, если попроще нужно.


<?php
set_time_limit(0);

$link = mysqli_connect('хост', 'пользователь', 'пароль', 'название БД');

if (mysqli_connect_errno()) {
echo 'Ошибка подключения к БД.';
exit();
}

$query = "SELECT `id`
FROM `dle_post`
WHERE `alt_name` IN (
SELECT `alt_name`
FROM `dle_post`
GROUP BY `alt_name`
HAVING COUNT(*) > 1
)"; // id или любые другие строки

if ($result = mysqli_query($link, $query)) {

$data = array();

while ($row = mysqli_fetch_assoc($result)) {
$data[$row['id']] = $row;
}

mysqli_free_result($result);
}

if (count($data) > 0) {
file_put_contents('log.txt', implode("\n", $data));
}

?>

$data***91;$row***91;'id'***93;***93; = $row; заменить на $data[$row['id']] = $row;

HM
На сайте с 14.01.2012
Offline
215
#7
orlov90:
php-скрипт сделайте и запустите на localhost, если попроще нужно.

Из CLI, вы хотели сказать.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий