Көп күндік элементтермен айдың күндеріне сандарды қайтару үшін SQL қоңырауы

Мен бірнеше SQL қоңырауларын біреуіне біріктіруге тырысамын және келесілердің мүмкін екенін білгім келді.

Міне менің үстелім.

Organization
    id

Event
    id,
    startDate
    endDate

FavoriteOrgs
    userId
    orgId

Айдың әр күні мен сол күні болған оқиғалардың санағын қайтарғым келеді. оқиғалар 2 немесе 3 күнге созылатын болуы мүмкін фактіні қоспайынша тым қиын емес.

Міне, бүгінгі күнде оқиғалар сандарын нақты көрсететін, бірақ ол тек басталатын күні есептелетін оқиғаны қамтиды.

SELECT DAYOFMONTH( CAST( o.start_date AS DATE ) ) AS dayNum, COUNT( * ) AS count
    FROM favoriteOrgs f, event e, organization o
    WHERE f.user_id =200372
    AND e.profile_id = o.id AND e.profile_id = f.profile_id AND o.id = f.profile_id
    AND e.last_date >=  '$startDate'
    AND e.start_date <=  '$lastDate'
    GROUP BY e.start_date
2
Сіз схеманы орналастыра аласыз ба?
қосылды автор hafichuk, көзі
Бұл схема емес. Мен бұл не екенін білмеймін. Mysql клиентінде 'DESC ұйымы', т.б. қараңыз. dev.mysql .com/doc/refman/5.0/en/describe.html .
қосылды автор hafichuk, көзі
Мен оны сұраққа қойдым, бірақ бұл жерде тағы да: ұйым (id); оқиға (id, startDate, endDate); favoriteOrgs (userId, orgId)
қосылды автор Jeremy Penrod, көзі
Ах. ID идентификаторы болып табылады. startDate және endDate - уақыт белгілері.
қосылды автор Jeremy Penrod, көзі

1 жауаптар

Сіздің деректеріңіздің үлгісі сіздің жүйеңіздегі барлық ұйымдарды іс жүзінде модельдеу емес. Бір нысан - бұл сіз туралы хабарлауға мүдделі күндер.

Дерекқорыңызға кестені қосу керек (немесе уақытша кестені, кірістірілген кестені немесе MySQL-тағы кез келген қол жетімді). Кесте барлық тиісті күндер. Тіпті 1900 жылға дейін және 2100 жылға дейін баратын кесте өте аз болады.

Сұрау содан кейін тривиальна болады:

CREATE TABLE Calendar (
    calendar_date DATE NOT NULL,
    CONSTRAINT PK_Calendar PRIMARY KEY CLUSTERED
)

SELECT
    C.calendar_date,
    COUNT(*) AS count
FROM
    favoriteOrgs F
INNER JOIN Event E ON
    E.profile_id = F.profile_id AND
    E.last_date >= '$startDate' AND
    E.start_date <= '$lastDate'
INNER JOIN Organization O ON
    O.id = F.profile_id AND
    O.id = E.profile_id
WHERE
    F.user_id = 200372
GROUP BY
    C.calendar_date

Енді сізде күнделікті күндерге, мысалы, «is_holiday» бағанында, «economic_quarter» немесе кез келген нәрсе сияқты бизнеске қатысты қосымша ақпаратты қоса аласыз. Жай ғана үстелді толтыруды ұмытпаңыз, бұл бір рет қана жүгіретін қарапайым цикл.

3
қосылды
Егер сіз тек күндізгі уақытқа бөлінгенін қаласаңыз, онда кодын әртүрлі деп санамаймын. Мен MS SQL адаммын және оларда TIMESTAMP деректерінің бұрмаланған түрі бар, сондықтан MySQL-ді қалай өңдейтініне сенімді емеспін. Егер сіз оны сағатпен немесе бірдеңемен бөліп алғыңыз келсе, онда сіз 1-ден 24-ге дейінгі сандардың жинақталған жиынтығында және күндермен бірге шелектерге негізделген JOIN кодын жасай аласыз. Кілт деректер жиынтығы ретінде шелек жиынтығын ойлайды.
қосылды автор Tom H, көзі
Мәссаған. Өте жақсы жауап, рахмет. Бұл жерде менің тәжірибемді кешіріңіз, бірақ қазіргі уақытта 'opportunity' кестесінің 'startDate' және 'endDate' бағандары уақыт белгілері болып табылады - мүмкіндіктері басталу және аяқталу уақыты, сондай-ақ күндер. Бұл шешімді уақыт белгілерімен бірге пайдаланудың тәсілі бар ма?
қосылды автор Jeremy Penrod, көзі