[sql] Вопросы по БД

Discussion in 'PHP' started by FraiDex, 25 Feb 2008.

Thread Status:
Not open for further replies.
  1. dr.Web

    dr.Web Member

    Joined:
    2 Feb 2009
    Messages:
    7
    Likes Received:
    22
    Reputations:
    10
    работает но не полностью. не все айди выводит

    вот запрос
    "SELECT * FROM (SELECT * FROM hosts_on_site WHERE timestamp>'$nachalo_dnya' and user IS NOT NULL GROUP BY user UNION SELECT * FROM hosts_on_site where timestamp>'$nachalo_dnya' GROUP BY ip) AS hosts_on_site where timestamp>'$nachalo_dnya' GROUP BY ip ORDER BY id DESC;"


    $nachalo_dnya=сегодня 00:00 таймштамп


    ах да может это изза того что с разных айпи чел может зайти и пишется в базу айди один и тот же а ип разный.
     
    #1801 dr.Web, 16 Dec 2012
    Last edited: 16 Dec 2012
  2. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    кхым...
    а без последней GROUP BY ip все айди выходят?
    вместо timestamp>'$nachalo_dnya' - timestamp >= UNIX_TIMESTAMP(curdate())
     
  3. dr.Web

    dr.Web Member

    Joined:
    2 Feb 2009
    Messages:
    7
    Likes Received:
    22
    Reputations:
    10
    не то надо уникальные айпи выводить а так он выводит все.
     
  4. DwH

    DwH New Member

    Joined:
    21 Feb 2012
    Messages:
    60
    Likes Received:
    2
    Reputations:
    0
    сделай так select distinct а потом подставь всё остальное, тогда будет сделана уникальная выборка с таблиц.
     
  5. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    в это случае ему это не поможет.
    Вообще ситуация не очень хорошая. Тут запрос нормально работать не будет. Тут сложная логика нужна.
    Еще ситуация:
    1|__2_|123.11.8.1
    2|NULL|123.11.8.1
    3|NULL|124.2.2.2
    4|__1_|90.0.0.2
    5|__1_|90.0.0.2
    6|NULL|90.0.0.2
    7|__3_|123.11.8.1 <- добавил :D
    здесь ид 1 и 7 разные user'а (__2_ и __3_) но IP у них общий (сеть на работе, или провайдер выдает общий IP)
    Ну и при группировке по IP мы кого-то "потеряем".
    Совет др.вэбу ориентироваться не на ip пользователей. акцент сделать на userа в отдельной задаче если возможно.
    user что IS NOT NULL обработать отдельно от тех что IS NULL.
    будут 2 разные таблицы, 2 разных представления.
    По другому нормально это не сделать, воображение подсказывает...
     
  6. DwH

    DwH New Member

    Joined:
    21 Feb 2012
    Messages:
    60
    Likes Received:
    2
    Reputations:
    0
    Плохо то что в Мускуле например как в Оракле нет аналитической функции, через неё можно было бы решить эту проблему, в практике было такое.
     
  7. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    Ну объединить данные усилиями хранимых процедур, если дрвэб умеет, а хостинг дозволяет. Или это сделать в пхп, если данные за текущий день то видимо строк не много наберет.
    Зависит от того как ему нужно отобразить эти данные? В виде таблицы данных или графиков? или еще чего
     
  8. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    Сделайте EXPLAIN запроса, посмотрите какой индекс использует мускул для запроса. Если индексов несколько то можно попробовать в запросе принудительно использовать другой индекс USE INDEX () или форс. В зависимости от индекса может помочь.
     
  9. DwH

    DwH New Member

    Joined:
    21 Feb 2012
    Messages:
    60
    Likes Received:
    2
    Reputations:
    0
    Согласен с Art!P тоже может помочь.

    Но тут уже дело в администрирование, база большая нужна разделить на partitions по датам и тогда ускорение достигается даже в случае выполнения запросов, затрагивающих все данные во всех партициях — ведь в этом случае сначала происходит первичная «обработка» таблиц по меньше, потом данные объединяются и производятся финальные вычисления. Так вот как раз «первые» этапы, в данном случае будут происходить гораздо быстрее.
     
  10. DwH

    DwH New Member

    Joined:
    21 Feb 2012
    Messages:
    60
    Likes Received:
    2
    Reputations:
    0
    Если честно то вопрос не понятен, как я понял тебе нужна распарсить маил, если так то лучше всего на уровне php сделать всё это, так как ну уровне базы будет очень долго работать.
     
  11. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    Тут от поля email зависит, в таблице оно может быть уникальным полем. Добавления с помощью INSERT IGNORE

    500млн и все с email? Подружиться чтоль с тобой :rolleyes:
     
  12. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    intertrey то что описали - думается самый лучший вариант. Ну у Вас таблица снабдится лишним полем domen (его лучше индексировать), всё окупается скоростью работы. Ограничение выборки это всегда было решением, ибо выборка из десятков..сотен миллионов или из тысяч - есть огромная разница.
     
    #1812 Art!P, 15 Jan 2013
    Last edited: 15 Jan 2013
  13. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    Убрать все дубли, причем не должно быть 0-лей, NULLов.
     
  14. DwH

    DwH New Member

    Joined:
    21 Feb 2012
    Messages:
    60
    Likes Received:
    2
    Reputations:
    0
    Можно ещё PROCEDURE написать для этих дел.
     
  15. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Хай. Как проделать такую вещь:
    Есть таблица с продуктами. И есть таблица со свойствами продуктов:

    CREATE TABLE `attribute_values` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `product_id` int(11) NOT NULL,
    `attribute_id` int(11) DEFAULT NULL,
    `option_id` int(11) DEFAULT NULL,
    `is_checked` int(11) DEFAULT NULL,
    `value` text,
    PRIMARY KEY (`id`),
    )
    Организовываю поиск по продуктам. Я делал через inner join и так для каждого аттрибута inner join писал. Потом когда я выбрал не одно свойство, а несколько, то результата запроса так и не дождался. Как это правильно организовать?
     
  16. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    много как-то джоинов для 2-х таблиц-то и это не понятно.
    Покажите запрос
     
  17. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Так в этом то и дело. Работает очень долго при выборе многих св-в. Получаются такие вот запросы:
    Code:
    SELECT `Catalog`.`id` FROM `main`.`cms_catalog` AS `Catalog`  
    inner JOIN `main`.`cms_attribute_values` AS `J31` ON (`J31`.`is_checked` = 1 AND `J31`.`attribute_id` = '29' AND `J31`.`product_id` = `Catalog`.`id`) 
    inner JOIN `main`.`cms_attribute_values` AS `J32` ON (`J32`.`is_checked` = 1 AND `J32`.`attribute_id` = '32' AND `J32`.`product_id` = `Catalog`.`id`) 
    ORDER BY `Catalog`.`price` DESC LIMIT 30
    
     
  18. Art!P

    Art!P Elder - Старейшина

    Joined:
    22 Jan 2008
    Messages:
    169
    Likes Received:
    28
    Reputations:
    5
    Если всё правильно понял :rolleyes: . Объединение таблиц и условия выборки (свойства продуктов вынесены в предикат)
    SELECT `Catalog`.`id` FROM `main`.`cms_catalog` AS `Catalog`
    inner JOIN `main`.`cms_attribute_values` AS `J31` ON `J31`.`product_id` = `Catalog`.`id`
    WHERE
    `J31`.`is_checked` = 1 AND (`J31`.`attribute_id` = '29' OR `J31`.`attribute_id` = '32')
    ORDER BY `Catalog`.`price` DESC LIMIT 30
     
  19. Seravin

    Seravin Active Member

    Joined:
    25 Nov 2009
    Messages:
    475
    Likes Received:
    190
    Reputations:
    221
    Понял правильно, но такой запрос почему-то не хочет работать. А если подойти с другой стороны. Можно ли как-то выбрать из таблицы со свойствами выбрать id продуктов, допустим у которых (is_checked=1 и attribute_id=12) и (is_checked=1 и attribute_id=13)? я вообще не могу понять как такой запрос составить
     
  20. DwH

    DwH New Member

    Joined:
    21 Feb 2012
    Messages:
    60
    Likes Received:
    2
    Reputations:
    0
    (is_checked=1 и attribute_id in (12,13)) и.т.д
     
Thread Status:
Not open for further replies.