подсчет совпадений в одной таблице

usascha

Новичок
подсчет совпадений в одной таблице

Всем привет.
У меня есть таблица, в которой (сам знаю) не совсем правильно хранятся немногочисленные данные в виде:
id | name | desc

1 | иванов | ё123ё123
2 | иванов, петров | 12341234
3 | иванов, сидоров | 23423432
4 | сидоров, петров | 234234234
...
НУЖНО: получить количество вхождений на фамилии (иванов, сидоров, петров ...) отдельно и вывести их в столбик с количеством совпадений.

Я додумался до следующего кода:
PHP:
$best_author=mysql_query("SELECT author_name FROM authors");
$j=0;
	while ($row=mysql_fetch_array($best_author)) {
		$names[$j]=explode(", ",$row["author_name"]);
		echo($names[$j]);
		$j++;
	}
Если этот код правильный, то мне уже можно чем-то гордиться, но что с результатом его выполнения делать я не знаю. Подскажите, пожалуйста.

Если не правильно мыслю, то подскажите какими функциями и в какой последовательности надо воспользоваться.
 

_pv_

Guest
usascha, я если честно нифига не понял, что ты хочешь.
Для начала в записи name не может быть несколько имен. Это бессмысленно.
id | name | desc

1 | иванов | ё123ё123
2 | петров | 12341234
3 | сидоров | 23423432
4 | сидоров | 234234234
5 | иванов | ё1223ё123
6 | иванов | ё1243ё123

Теперь если ты хочешь выбрать записи с именами Иван, Сидоров, то запрос будет выглядеть так
select * from tab where name='иванов' or name='сидоров'

Если хочешь посмотреть сколько записей с 'Иван', а потом сколько с 'Сидоров', то сделай 2а запроса
select * from tab where name='иванов'
select * from tab where name='сидоров'
И отдельно их обрабатывай.

Хотелось бы так же посмотреть, как ты создавал эту таблицу... Т.е. sql запросы... И зачем нужно поле desc?

Если этот код правильный, то мне уже можно чем-то гордиться, но что с результатом его выполнения делать я не знаю.
Так это... поставь Денвер на локальную машину(если не можешь поставить Apache+PHP+Mysql) и посмотри работает или нет. У меня нет желания проверять :)
 

usascha

Новичок
Чтобы сделать выборку из таблицы с 30 записями, наверно, другого способа как поставить новую операционку и прочие прибамбасы нет! Спасибо за дельный совет. Даже с моими знаниями понятно, что цель не оправдывает средства.

Данные хранятся как я указал: повторения возможны. Смысл этой таблицы в том, что это авторы книг. Иногда автор один, а иногда он написал книгу в соавторстке с кем-то. Мне нужно знать сколько раз автор встречается. Записывать каждого автора отдельно - думаю менее рационально, т.к. нжно обрабатывать книгу, кто ее автор, с кем он в соавторстве еще что-то. Короче это дольше и сложнее, чем следать разбор имеющихся совпадений.
 

Cougar

Кошак
usascha
И тем не менее - правильнее будет сделать отдельную таблицу с именами авторов.

И почитай про нормализацию БД - тогда в дальнейшем у тебя подобных вопросов возникать не будет (скажем, почитай Мартина Грубера - рекомендую)
 

usascha

Новичок
таблица с авторами и так отдельная. Наверно, можно сказать, что нормализация данных сделана, но не полностью.

Например, запись Иванов И.И. есть только одна. Но есть другая уникальная запись - Иванов И.И., Петров П.П.
Также может быть и третья запись Иванов И.И., Петров П.П., Сидоров С.С.

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

Мутник

Новичок
А не проще использовать count() и GROUP? и, насколько я знаю, это можно сделать одним запросом. Только надо немного помучиться.
 

usascha

Новичок
Так меня сейчас считает, но это не то что нужно.
В результате имею подсчет
Иванов И.И. - 1
Иванов И.И., Петров П.П. -
Иванов И.И., Петров П.П., Сидоров С.С. - 1

А надо:
Иванов И.И. - 3
Петров П.П. - 2
Сидоров С.С. - 1
 

Мутник

Новичок
usascha

хех... а еще:

Ива =3
Пет = 3
Сидо = 1

или ты знаешь по каким критериям тебе надо считать?
 

usascha

Новичок
Знаю, все фамилии разделены запятыми как в примере.
В первом посте я написал код, который правильно разбирает фамилии в массивы, но вот как дальше действовать я не знаю.
 

_pv_

Guest
usascha если у тебя стоит *unix, то я думаю для тебя не составит труда поставить Apache+PHP+Mysql.

Вторая мысль. Создай таблицу вида
id | avtor | name_book
1| Иванов | PHP5
2| Петров | PHP5
3| Сидоров | WEb-дизайн
4| Иванов | Использование CSS
5| Петров | HTML - это круто

И получится, что книгу PHP5 написали 2а автора. Далее думаю все понятно.

P.s. Возрадуйся.
 

yugene

Отошел от дел
_pv_, может, хватит бредить?

Автор оригинала: usascha
таблица с авторами и так отдельная. Наверно, можно сказать, что нормализация данных сделана, но не полностью.

Например, запись Иванов И.И. есть только одна. Но есть другая уникальная запись - Иванов И.И., Петров П.П.
Также может быть и третья запись Иванов И.И., Петров П.П., Сидоров С.С.
Это не нормализация.

Хотя и при твоем способе хранения данных ничего сложного нет в том, чтобы получить нужный результат (массивы + explode), сделай, как тебе сказали - храни данные нормально.
 

usascha

Новичок
ну раз просто, так скажите как. Я понимаю, что (массивы+explode), но как?
ВЫшенаписанный код создает массивы состоящие из одного или нескольких элементов в зависимости от количества авторов в строке. ДАЛЬШЕ ЧТО?
 

yugene

Отошел от дел
Кстати, почему ты решил, что у тебя вторую книгу написал тот же самый иванов, что и первую книгу?

-~{}~ 23.04.05 17:31:

Говорят тебе - меняй структуру таблиц!
 

_pv_

Guest
Автор оригинала: yugene
Кстати, почему ты решил, что у тебя вторую книгу написал тот же самый иванов, что и первую книгу?
Потому что Иванов написал PHP5 и Петров написал PHP5... значит PHP5 написали два автора(и тот же самый Иванов написал Использование CSS). Это и есть разумный подход и твой сарказм бесит. Если ты такой умный и знаешь способ лучше, то будь добр поделись им.

[add] Могут быть две или более одинаковых фамилии, поэтому нужно их определить(тот же idavtor) по другому. Но я не говорил, что я буду тут выкладывать рабочие варианты кода. Идею я уже сказал и разжевал как мог. И большое спасибо за то что зря потратил время ибо я несу бред.
 

Cougar

Кошак
usascha
Ну йопт... я ж не зря советовал книгу почитать... в частности - связь один-ко-многим. Всё. Проблема решена.
 

yugene

Отошел от дел
Автор оригинала: yugene
Кстати, почему ты решил, что у тебя вторую книгу написал тот же самый иванов, что и первую книгу?
Это было адресовано usascha :)

Автор оригинала: _pv_
Потому что Иванов написал PHP5 и Петров написал PHP5... значит PHP5 написали два автора(и тот же самый Иванов написал Использование CSS).
Вопрос тебе: почему ты решил, что эти авторы писали одну и ту же книжку PHP5? :) И именно тот же самый Иванов написал про CSS?
 

Cougar

Кошак
yugene
Если человек не желает понимать, что такое реляционные базы данных - ты ему не поможешь :D
 

usascha

Новичок
Я знаю, что каждый автор уникальный потому что я их всех (авторов) знаю лично. Мне не нужно следить за совпадениями, т.к. я уверен, что их не будет.

Говорить про то знаю я что такое реляционные БД или нет, вы не можете, т.к. даже не знакомы со мной. Не стоит углубляться в своем гадании, здесь это не принято.

Если мой первый вопрос засталяет обсуждать все что угодно, но не сам вопрос, попробую сформулировать его по другому:

Есть несколько массивов выводимых через mysql_fetch_array:

array ( 0 => 'Иванов И.И.', )array ( 0 => 'Петров П.П.', )array ( 0 => 'Иванов И.И.', 1 => 'Петров П.П.', 2 => 'Сидоров С.С.', )array ( 0 => 'Петров П.П.', )array ( 0 => 'Петров П.П.', )

Как посчитать все совпадения?
 

_pv_

Guest
usascha
Ответ на твой вопрос
select * from table where name like '%Петров П.П%';
select * from table where name like '%Иванов И.И.%';
...

P.s. ну новичок я! ну что поделаешь? Покажите как нужно построить связь один-ко-многим для этого примера. У меня почему-то ничего хорошего в голову не приходит.
 

usascha

Новичок
это не ответ на вопрос, т.к. мне нужно вводить условие like где-то. А я не хочу узнавать количество совпадений только по одному автору - мне нужно, чтобы все авторы вывелись в столбик и сами посчитались.

Если вторая часть Вашего поста адресована мне, то скажу, что в моем случае есть вторая стадия нормализации, когда сведения вынесены в отдельную таблицу, но записи могут повторяться.

Меня это устраивает, т.к. связь один-ко многим имеет место в том случае, когда авторы Иванов, Петров, Сидоров являются авторами нескольких книг. При этом у меня есть пример, когда те же Иванов и Петров являются авторами другой книги (предыдущее издание), но запись "Иванов, Петров" отдельная.
 
Сверху