За последние 24 часа нас посетили 24469 программистов и 1656 роботов. Сейчас ищут 880 программистов ...

Задача на собеседовании

Тема в разделе "MySQL", создана пользователем kowapos, 18 июн 2015.

  1. kowapos

    kowapos Активный пользователь

    С нами с:
    18 янв 2013
    Сообщения:
    120
    Симпатии:
    0
    Вообщем, проходил я маленькое собеседование. Задали одну единственную задачу, решил я ее не оптимально.
    интересно посмотреть на ваши решения.

    Условия: Есть две таблицы: customers и comments. Customers – это таблица пользователей (два поля: id – уникальный идентификатор пользователя и name – имя пользователя). Comments – это таблица комментариев, которые эти пользователи оставляли на сайте (два поля: customers_id – это id пользователя из таблицы customers и второе поле: text 0 текст комментария).

    Код (PHP):
    1. CREATE TABLE customers (
    2.  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    3.  name VARCHAR(255) NOT NULL 
    4. )CHARACTER SET utf8
    5. COLLATE utf8_general_ci;
    6.  
    7. CREATE TABLE comments (
    8.  customers_id INT(11) NOT NULL,
    9.  text TEXT NOT NULL
    10. )CHARACTER SET utf8
    11. COLLATE utf8_general_ci;
    12.  
    13. INSERT INTO customers(id, name) VALUES(1,'John'),(2,'Bob'),(3,'Sue');
    14.  
    15. 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):
    1. select cu.name, (select count(customers_id) from comments where customers_id=cu.id) as comments 
    2. from customers as cu
    3. inner join comments as co on cu.id=co.customers_id
    4. group by cu.id
    5. order by comments desc
    6. limit 1
    решение не оптимально, я это знаю и сообщил что есть решение оптимальнее с использованием функции max(), но не смог использовать.

    оптимальное решение мне не предоставили

    PHP, JavaScript, SQL и другой код пишите внутри тегов
    Код ( (Unknown Language)):
    1. [b]php][/b]Тут код[b][/[/b][b]code][/b][/color]
     
  2. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    Код (Text):
    1. 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):
    1. 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
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    http://sqlfiddle.com/#!9/4bc6a/2

    Код (Text):
    1. SELECT cust.id, cust.name, comsum.cnt
    2. FROM
    3.   (
    4.     SELECT customers_id, COUNT(*) AS cnt
    5.     FROM comments
    6.     GROUP BY customers_id
    7.     ORDER BY cnt DESC
    8.     LIMIT 1
    9.   ) AS comsum JOIN
    10.   customers AS cust ON cust.id=comsum.customers_id
    11.  
    Добавлено спустя 4 минуты 50 секунд:
    ах, Зульдек уже написал аналогичное решение. не заметил, наверное из-за отсутствия форматирования ;)
     
  4. Zuldek

    Zuldek Старожил

    С нами с:
    13 май 2014
    Сообщения:
    2.381
    Симпатии:
    344
    Адрес:
    Лондон, Тисовая улица, дом 4, чулан под лестницей
    да, надо мне аккуратнее быть.