Вообщем, проходил я маленькое собеседование. Задали одну единственную задачу, решил я ее не оптимально. интересно посмотреть на ваши решения. Условия: Есть две таблицы: customers и comments. Customers – это таблица пользователей (два поля: id – уникальный идентификатор пользователя и name – имя пользователя). Comments – это таблица комментариев, которые эти пользователи оставляли на сайте (два поля: customers_id – это id пользователя из таблицы customers и второе поле: text 0 текст комментария). Код (PHP): CREATE TABLE customers ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL )CHARACTER SET utf8 COLLATE utf8_general_ci; CREATE TABLE comments ( customers_id INT(11) NOT NULL, text TEXT NOT NULL )CHARACTER SET utf8 COLLATE utf8_general_ci; INSERT INTO customers(id, name) VALUES(1,'John'),(2,'Bob'),(3,'Sue'); INSERT INTO comments(customers_id,text) VALUES(1,'Nice one!'),(2,'I will give it a try.'),(2,'HTML is not a programming language'),(3,'SQL rulezzz!'); Задача: Написать максимально производительный mysql запрос поиска имени пользователя, оставившего наибольшее количество комментариев. ______ мое решение Код (PHP): select cu.name, (select count(customers_id) from comments where customers_id=cu.id) as comments from customers as cu inner join comments as co on cu.id=co.customers_id group by cu.id order by comments desc limit 1 решение не оптимально, я это знаю и сообщил что есть решение оптимальнее с использованием функции max(), но не смог использовать. оптимальное решение мне не предоставили PHP, JavaScript, SQL и другой код пишите внутри тегов Код ( (Unknown Language)): [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
Код (Text): select t.cnt, cu.name FROM (SELECT count(c.text) cnt, c.user_id FROM comments c GROUP BY c.user_id ORDER BY cnt desc LIMIT 1) t JOIN customers cu on cu.id = t.user_id Или Код (Text): select cu.name, count(c.text) cnt FROM comments c JOIN customers cu ON cu.id = c.user_id GROUP BY c.user_id ORDER BY cnt desc LIMIT 1
http://sqlfiddle.com/#!9/4bc6a/2 Код (Text): SELECT cust.id, cust.name, comsum.cnt FROM ( SELECT customers_id, COUNT(*) AS cnt FROM comments GROUP BY customers_id ORDER BY cnt DESC LIMIT 1 ) AS comsum JOIN customers AS cust ON cust.id=comsum.customers_id Добавлено спустя 4 минуты 50 секунд: ах, Зульдек уже написал аналогичное решение. не заметил, наверное из-за отсутствия форматирования