|
|
|
| структура: 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
|
| |
|
|
|
|
|
|
|
для: talka
(14.05.2009 в 18:46)
| | По логике 4 первых запроса вернут разное количество строк. Или нет? Приведите небольшой пример таблицы с данными и нужный результат | |
|
|
|
|
|
|
|
для: Евгений Петров
(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 | |
|
|
|
|
|
|
|
для: talka
(21.05.2009 в 02:00)
| | В MySQL ( и вообще в реляционных базах) однородные данные не хранят построчно.
Отсюда и Ваша надуманная проблема. | |
|
|
|
|
|
|
|
для: Trianon
(21.05.2009 в 08:56)
| | Подскажите тогда КАК их хранить? | |
|
|
|
|
|
|
|
для: talka
(21.05.2009 в 17:04)
| | ТАК и храните. Очень правильное решение!!! | |
|
|
|
|
|
|
|
для: 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 раза, чем самих записей.
Ткните в более удобную структуру, пожалуйста. | |
|
|
|
|
|
|
|
для: 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.
Для начала определитесь, какой вариант вам нужен. | |
|
|
|
|
|
|
|
для: yuk
(18.05.2009 в 21:27)
| | Я бы так написал
SELECT COUNT(type1) AS cnt1 FROM табл.
|
| |
|
|
|
|
|
|
|
для: Владимир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 опущены | |
|
|
|