Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: COUNT без GROUP BY
 
 автор: talka   (14.05.2009 в 18:46)   письмо автору
 
 

структура: id, type1, type2, type3, type4
нужно вывести:
id: type1-количество type1, type2-количество type2, type3-количество type3, type4-количество type4

Решение:

SELECT id, type1, COUNT(type1) AS cnt1 FROM tbl GROUP BY type1
SELECT id, type2, COUNT(type2) AS cnt2 FROM tbl GROUP BY type2
SELECT id, type3, COUNT(type3) AS cnt3 FROM tbl GROUP BY type3
SELECT id, type4, COUNT(type4) AS cnt4 FROM tbl GROUP BY type4


а проще можно? Как-нибудь, типа

SELECT id, type1, COUNT(type1) AS cnt, type2, COUNT(type2) AS cnt2, type3, COUNT(type3) AS cnt3, type4, COUNT(type4) AS cnt4 FROM tbl

  Ответить  
 
 автор: Евгений Петров   (16.05.2009 в 03:53)   письмо автору
 
   для: talka   (14.05.2009 в 18:46)
 

По логике 4 первых запроса вернут разное количество строк. Или нет? Приведите небольшой пример таблицы с данными и нужный результат

  Ответить  
 
 автор: talka   (21.05.2009 в 02:00)   письмо автору
 
   для: Евгений Петров   (16.05.2009 в 03:53)
 

Да.
Структура:
id, type1, type2, type3, type4

Данные:
1, AAA, BBB, CCC, DDD
2, BBB, EEE, NULL, NULL
3, ССС, NULL, NULL, NULL
4, FFF, GGG, AAA, NULL
5, KKK, HHH, NULL, NULL

Нужный результат:
1: AAA - 2, BBB - 2, CCC - 2, DDD - 1
2: BBB - 2, EEE - 1
3: CCC - 2
4: FFF - 1, GGG - 1, AAA - 2
5: KKK - 1, HHH - 1

В конечном итоге, интересуют строки, где все значения типов встречаются только 1 раз, в данном случае - это строка с id=5. Усложняет задачу огромный объем данных (десятки миллионов).

Пока задача решена на php, но хотелось бы использовать возможности MySQL

  Ответить  
 
 автор: Trianon   (21.05.2009 в 08:56)   письмо автору
 
   для: talka   (21.05.2009 в 02:00)
 

В MySQL ( и вообще в реляционных базах) однородные данные не хранят построчно.
Отсюда и Ваша надуманная проблема.

  Ответить  
 
 автор: talka   (21.05.2009 в 17:04)   письмо автору
 
   для: Trianon   (21.05.2009 в 08:56)
 

Подскажите тогда КАК их хранить?

  Ответить  
 
 автор: Деген   (21.05.2009 в 17:15)   письмо автору
 
   для: talka   (21.05.2009 в 17:04)
 

ТАК и храните. Очень правильное решение!!!

  Ответить  
 
 автор: talka   (21.05.2009 в 17:16)   письмо автору
 
   для: talka   (21.05.2009 в 17:04)
 

1. id этой таблицы связан с другой таблицей, из которой извлекается результат (WHERE id IN())
2. 4 "однородных" значения каждой записи для этой записи уникальны.
3. По каждому значению типа нужен поиск (например, показать все записи, где type1='AAA' OR type2='AAA' OR type3='AAA' OR type4='AAA')
4. Типов может быть бесконечное множество. Их больше в 2-3 раза, чем самих записей.

Ткните в более удобную структуру, пожалуйста.

  Ответить  
 
 автор: yuk   (18.05.2009 в 21:27)   письмо автору
 
   для: talka   (14.05.2009 в 18:46)
 

Тут возможны 2 варианта:
Допустим, в таблице хранятся записи. Одна запись может быть только одного типа. Тогда структура таблицы должна выглядеть хотя бы так:
id INT
type VARCHAR(n)

Но лучше было бы сделать две таблицы:
Первая:
id INT
type_id INT

Вторая:
type_id INT
type VARCHAR(n)

И связывать потом эти таблицы по полю type_id.


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

первая:
rec_id INT

вторая:
rec_id INT
type_id INT

третья:
type_id INT
type VARCHAR(n)

И связывать их соответственно по rec_id и type_id.

Для начала определитесь, какой вариант вам нужен.

  Ответить  
 
 автор: Владимир55   (18.05.2009 в 23:16)   письмо автору
 
   для: yuk   (18.05.2009 в 21:27)
 

Я бы так написал
SELECT COUNT(type1) AS cnt1 FROM табл.

  Ответить  
 
 автор: talka   (21.05.2009 в 02:51)   письмо автору
 
   для: Владимир55   (18.05.2009 в 23:16)
 

Может быть имеет смысл показать решение, которое хочется оптимизировать средствами MySQL:

SELECT id, type1, type2, type3, type4 FROM tbl

далее в цикле while собираем два массива:
ассоциативный массив массивов, где id - ключ, типы - значения
распечатка массива $ArrTypes:

Array
(
    [1] => Array
        (
            [type1] => AAA
            [type2] => BBB
            [type3] => CCC
            [type4] => DDD
        )

    [2] => Array
        (
            [type1] => BBB
            [type2] => EEE
        )

    [3] => Array
        (
            [type1] => CCC
        )

    [4] => Array
        (
            [type1] => FFF
            [type2] => GGG
            [type3] => AAA
        )

    [5] => Array
        (
            [type1] => KKK
            [type2] => HHH
        )
);

и простой ассоциативный, где в качестве ключа выступает тип, а в качестве значения - кол-во (аналог array_count_values())
распечатка массива $ArrCnt:

Array
(
     [AAA] => 2
     [BBB] => 2
     [CCC] => 2
     [DDD] => 1
     [EEE] => 1
     [FFF] => 1
     [GGG] => 1
     [KKK] => 1
     [HHH] => 1
);

выходим из цикла while и обходим массив $ArrTypes foreach'ем

 foreach($ArrTypes AS $Id => $ArrType)  {
   // если каждое значение type одной записи встречается 1 раз - пишем id в конечный (нужный) массив
    if($ArrCnt[$ArrType['type1']]==1 && $ArrCnt[$ArrType['type2']]==1 && $ArrCnt[$ArrType['type3']]==1 && $ArrCnt[$ArrType['type4']]==1) $ArrResult[]=$Id;
 }

N.B. проверки на значение NULL опущены

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования