Как я комбинирую 3 SQL-запроса в 1?

каждое отображение должно иметь ленивую загрузку с

в Node Map:

Map(x => x.EntityType).Not.LazyLoad();

в EnityType Map:

Map(x => x.Properties).Not.LazyLoad();

и так далее ...

Также см. NHibernate Eager, загружающий многоуровневые дочерние объекты для одноразовой загрузки

Добавлено:

Дополнительная информация по Sql N + 1:

http://nhprof.com/Learn/Alerts/SelectNPlusOne

5
задан Svante 18 June 2009 в 15:29
поделиться

6 ответов

SELECT  DAY(updated_at), WEEK(updated_at), COUNT(*) AS visits
FROM    parts_development.page_views p
WHERE   updated_at >= DATE_SUB(NOW(),INTERVAL 1 year)
GROUP BY
        DAY(updated_at), WEEK(updated_at) WITH ROLLUP

Это будет подсчитывать посещения в течение года, группируя их по дню, неделе и общему количеству.

Если вы просто хотите выбрать посещения на день, неделю и год по три столбцы, используйте это:

SELECT  (
        SELECT  COUNT(*)
        FROM    parts_development.page_views p
        WHERE   updated_at >= DATE_SUB(NOW(),INTERVAL 1 DAY)
        ) AS last_day,
        (
        SELECT  COUNT(*)
        FROM    parts_development.page_views p
        WHERE   updated_at >= DATE_SUB(NOW(),INTERVAL 7 DAY)
        ) AS last_week,
        (
        SELECT  COUNT(*)
        FROM    parts_development.page_views p
        WHERE   updated_at >= DATE_SUB(NOW(),INTERVAL 1 YEAR)
        ) AS last_year
4
ответ дан 14 December 2019 в 04:45
поделиться
2
ответ дан 14 December 2019 в 04:45
поделиться

Если вам нужно еще две строки, используйте UNION ALL. У вас все еще есть 3 запроса, но они выполняются как один.

Если вам нужно еще два столбца, используйте SUM ( CASE (...)). Обычно вы переходите от предложения WHERE к предложению CASE по 3 раза, каждое с собственным условием.

1
ответ дан 14 December 2019 в 04:45
поделиться
SELECT COUNT(updated_at) AS 'TODAY'
FROM parts_development.page_views day
    INNER JOIN (SELECT COUNT(updated_at) AS 'WEEK', parts_user_id as userid 
                FROM parts_development.page_views p
                WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 week) 
                GROUP BY parts_user_id) week
        ON day.parts_user_id = week.userid
     INNER JOIN (SELECT COUNT(updated_at) AS 'YEAR', parts_user_id as userweek 
                FROM parts_development.page_views p
                WHERE updated_at >= DATE_SUB(NOW(),INTERVAL 1 year) 
                GROUP BY parts_user_id) year
        ON day.parts_user_id = year.userid
WHERE day.updated_at >= DATE_SUB(NOW(),INTERVAL 1 day)
GROUP BY day.parts_user_id

Не цитируйте мой синтаксис «ИНТЕРВАЛ», я не искал его, я сам являюсь парнем TSQL. Этого также можно добиться с помощью профсоюзов. Вы также можете заменить предложения where предикатами в соединениях.

0
ответ дан 14 December 2019 в 04:45
поделиться

как насчет

SELECT count(*), IsToday(), IsThisWeek() 
   FROM whatever 
   WHERE IsThisYear() 
   GROUP BY IsToday(), IsThisWeek()

, где функции Is * () являются логическими функциями (или выражениями)

0
ответ дан 14 December 2019 в 04:45
поделиться

Нет необходимости присоединяться или выполнять частичный выбор из таблицы более одного раза.

    SELECT parts_user_id,
           SUM( IF( updated_at >= DATE_SUB( NOW(), INTERVAL 1 DAY ), 1, 0 ) )
            as day_visits,
           SUM( IF( updated_at >= DATE_SUB( NOW(), INTERVAL 7 DAY ), 1, 0 ) )
            as week_visits,
           count(*) as year_visits
      FROM parts_development.page_views
     WHERE updated_at >= DATE_SUB( NOW(),INTERVAL 1 year )
  GROUP BY parts_user_id
1
ответ дан 14 December 2019 в 04:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: