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

SelenIT

IT-лунатик :)
usascha
Есть несколько массивов выводимых через mysql_fetch_array: <пример>. Как посчитать все совпадения?
Что-то вроде такого?
PHP:
$result = array();
foreach ($big_array as $array) { // $big_array - массив из примера
   foreach ($array as $name) {
      if (!isset($result[$name])) $result[$name] = 1;
      else $result[$name]++;
      // если не важна аккуратность - достаточно @$result[$name]++;
   }
}
print_r($result);
Cougar
Если учесть, что один и тот же Иванов может выступать как автор разных книг, тут больше похоже на связь многие-ко многим (имхо)...

pv
Для связи многие-ко-многим, на мой взгляд, твой первый пример был не так уж плох - при условии, что имена авторов и названия книг уникальны. Но вообще в любом случае лучше использовать уникальные числовые id-ы - и универсальнее, и быстрее.
 

Cougar

Кошак
usascha

Ошибаешься... записи "Иванов" и "Петров" - это разные записи, а не запись "Иванов, Петров"... если интересно, вот примерная структура таблиц:

[sql]
CREATE TABLE book (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
title CHAR(255) NOT NULL DEFAU:T 'Untitled'
);

CREATE TABLE author (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name CHAR(255) NOT NULL DEFAULT 'John Doe',
book_id INT UNSIGNED NOT NULL DEFAULT 0,
FOREIGN KEY (book_id) REFERENCES book (id) ON UPDATE CASCADE ON DELETE RESTRICT
);
[/sql]

-~{}~ 24.04.05 02:09:

Да, забыл... FOREIGN KEY, разумеется, имеет смысл только для таблиц InnoDB
 

usascha

Новичок
Автор оригинала: SelenIT
usascha

Что-то вроде такого?
...
SelenIT,
вот как я понял Ваш код. ПОнял неправильно, т.к. на выходе только цифра 2.
Что надо переделать, подскажите, пожалуйста.

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"]);
		$j++;
	}
$result = array(); 
foreach ($names as $array) {
   foreach ($array as $name) { 
      if (!isset($result[$name])) $result[$name] = 1; 
      else $result[$name]++; 
++; 
   } 
} 
print_r($result[$name]);
 

SelenIT

IT-лунатик :)
usascha
найти и исправить одно отличие в последней строчке

сейчас у тебя выводит количество повторений последней фамилии в списке
 

betik

Новичок
Хочу мерседес бенс.
Нахаляву.
С документами.
Новый.
С гарантией.

Дайте.
 

usascha

Новичок
SelenIT, спасибо Вам за помощь. Смог сделать, то что хотел уже давно, но то руки никак не доходили, то заходил в тупик с решением...

По итогам есть вопрос: существует ли какая-нибудь возможность сортировать получившийся массив по двум ключам? А именно, сначала по фамилии, а потом по количеству книг.
Функция array_multisort, как я понимаю, дает такую возможность для нескольких массивов. А внутри одного как?
 

usascha

Новичок
Возможно, я неправильно понял суть этой функции, но я как-то не смог осознать ее применение для моего случая.

У меня массив одномерный: фамилия - значение.
Я бы хотел отсортировать ее как при выборке из базы. Что-то типа:
Код:
ORDER BY book.data DESC, 
	book.book_title ASC,
	authors.author_name ASC
Вообще-то, молчу-молчу... :rolleyes:
Попробовал вот так:
PHP:
array_multisort($result[1], SORT_NUMERIC, SORT_DESC, 
				$result[0], SORT_STRING, SORT_ASC);
Сортирует, но только по result[0], result[1] не понимает
 

Master

Guest
Господа в данном случае классическое соотношение М:М (много ко многим) и решаетсся оно просто через создание промежуточной таблицы.

таблица 1 ********** таблица 2 *******таблица 3
id_book | name_book** id_book | id_avtor** id_avtor | name_avtor
--- 1 --- бла1 бла1 ------ 1----------1----------1--------Иванов
--- 2---- бла2 бла2-------1---------- 2--------- 2--------Петров
--- 3---- бла3 бла3-------- 2--------- 2
----------------------------3 --------- 1

и далее в таком же духе (пришлось вставить доп знаки иначе седаются пробелы :D ).
И запросы в этом случае получаются вполе нормально :)
 
Сверху