Проверка на MySQL ID пропускает PHP - PullRequest
0 голосов
/ 08 августа 2011

скажем, в MySQL у меня есть столбец, который id, просто int автоинкремент.

Могу ли я использовать php, чтобы сообщить мне, когда есть идентификатор, который был удален?

Как, скажем, у меня

5 6 7 8 10

Мне нужно сказать, что 9 отсутствует, и продолжить это для всех идентификаторов. Есть ли способ сделать это?

Спасибо

Ответы [ 3 ]

2 голосов
/ 08 августа 2011

Вот один из способов сделать это:
1. Выберите все идентификаторы из таблицы.
2. Присвоение их всем хешу%:
5 => 1
6 => 1
7 => 1
8 => 1
10 => 1

То есть ваш идентификатор является ключом хэша, а его значение равно 1.

  1. Создать цикл for

для (мой $ i = 1; $ i <11; $ i ++) <br> {
if ($ hash {$ i}! = 1)
{
выведите «ID $ i отсутствует \ n»;
}
}

Это синтаксис Perl, но PHP должен быть очень похож.

2 голосов
/ 08 августа 2011

Если вы можете жить с отсутствием пропуска до первого идентификатора в базе данных (и запроса с использованием 'временной таблицы', 'файловой сортировки' и 'буфера соединения' ) :

SELECT
    a.id + 1 AS `From`,
    MIN(b.id - 1) AS `To`
FROM
    foo as a, foo as b
WHERE
    a.id < b.id
GROUP BY
    a.id
HAVING
    a.id < min(b.id) -1

автономный пример:

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// usually I create temporary tables for example scripts, but
// self-joins don't work on temp tables in mysql, bare me....
$pdo->exec('CREATE TABLE soFoo ( id int, primary key(id))');
$pdo->exec('INSERT INTO soFoo (id) VALUES (5),(6),(7),(8),(10),(15),(21)');

foreach( $pdo->query('
    SELECT
        a.id + 1 AS `From`,
        MIN(b.id - 1) AS `To`
    FROM
        foo as a, foo as b
    WHERE
        a.id < b.id
    GROUP BY
        a.id
    HAVING
        a.id < min(b.id) -1', PDO::FETCH_ASSOC) as $row
) {
    echo $row['From'], ' - ', $row['To'], "\n";
}

печать

9 - 9
11 - 14
16 - 20
2 голосов
/ 08 августа 2011

Вам нужна таблица, которая содержит все значения.Тогда просто сделать левое соединение, чтобы найти пропущенные идентификаторы.

create table all_values
(id int not null) engine = myisam;

insert into all_values (id) values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);

create table existing_values like all_values;

insert into existing_values (id) values (5),(6),(7),(8),(10);

select a.id from all_values as a
left join existing_values as b
on a.id = b.id
where b.id is null
...