Сортировка

DiMA

php.spb.ru
Команда форума
Сортировка

Привет люди, подскажите что делать.

Есть бооольшая таблица SQL и есть запрос, который выделит нужные строки, о нем не пишу, т.к. это не важно. Мне SQL выдает в ответ колонку чисел.

В базе нашлись строки подподающие под ответ:

9
1
5
5
2
9
5

И SQL это выдает в отсортированном виде (мне так нужно):

1
2
5
5
5
9
9

А еще нужно выделить те числа, которые встретились более 1 раза. Т.е мой запрос, кроме отсортированности, должен выкинуть те строки, где числа встретились более 1 раза и сообщить сколько встретилось чисел (т.е. ответ из двух строк "5" и "9" не подходит).

В идеале ответ должен получиться такой:

5
5
5
9
9

Руками проверять не хочется, т.к. ответ будет большим (и выдается не число, а целая строка с данными). Если это не возможно, подскажите идеи выделения из таблицы ответ SQL тех строк, номера которых встретились более 1 раза. Я подозреваю, что никак нельзя (даже с повторным SQL-запросом) сделать, но все же...

Если я как-то плохо объяснил - готов исправиться по первому требованию :)

Линух, ПХП 4.0.1.
 

tony2001

TeaM PHPClub
А если так ? :

1. Писать в массив все значения.
2. Потом каждый элемент массива сравнивать со всеми элементами (смотря, чтоб не дай бог это не был один и тот же).
3. Если равен, то писать в новый массив попадания (в первый раз то, которое сравнивается со всем массивом, во все остальные - только попадания).
4. Выводить значения $first_massiv[$second_massiv].
 

DiMA

php.spb.ru
Команда форума
К сожалению, так делать нельзя, т.к. операции по записи большого объема информации и последующий поиск по списку массивов займет очень много времени. Для сравнения можно выполнить $f=file("_файл_на_1_MБайт_.txt"). Собственно в этом и проблема, чтобы PHP как можно меньшую часть работы делал, т.к. MySQL намного эффективнее справляется с сортировкой.

Мне вот Voodoo подкинул такую мысль:

1. отправить мой запрос
2. записать все числа в новый запрос, подобный такому:
Select COUNT(первое число), COUNT(второе число) ... COUNT(последнее число) from table where "тоже самое, что и в предыдущем запросе"
3. результат записать в массив (получиться от 100 до 1000 чисел int - не много), т.е. если COUNT оказался больше единицы - пишем, иначе не пишем.
4. выбрать из первого запроса то, что нужно

Вот если бы можно было получить такую таблицу:
1 1
2 1
5 3
5 3
5 3
9 2
9 2
где на втором месте кол-во числел первой колонки, было бы здорого. Ну, если бы удалось заставить SQL вовсе не выдавать не нужные строки, было бы здорого. По-моему, вполне логичное желание знать кол-во строк, в которых написаны одинаковые числа. И не реализовано. Либо я не знаю как.
 

voodoo

Новичок
да блин. я тебе не эту идею говорил.

Говорил я примерно такое:

mysql> create table temp(num int);
mysql> insert into temp values(1), (5), (5), (5), (9), (9);
mysql> select num, count(num) from temp group by num;
+------+------------+
| num | count(num) |
+------+------------+
| 1 | 1 |
| 5 | 3 |
| 9 | 2 |
+------+------------+
3 rows in set (0.03 sec)
mysql>

После этого делаешь запрос
select * from YourTable where num=5 or num=9;
(num берешь из первого запроса).
и получаешь нужный тебе массив.
 
Сверху