Haftaiçi / Haftasonu saymak için MySQL / PHP Algoritma (başına ay)

2 Cevap php

Ben kodlama başlamadan önce, ilk olarak iyi bir tasarım ile gelmek istiyorum. Temelde, ben tarihleri ​​ile dolu bir veritabanı tablo var, ve o tarihlerde (tarihleri ​​sql biçiminde olan) ile ilişkilidir kullanıcılar.

PHP kullanarak ben, her kullanıcı için, ilişkili oldukları kaç hafta sonları ilişkili oldukları kaç hafta içi (toplam sayımı) hesaplamak yanı sıra istiyorum. Ben her ay için toplam sayısını, hem de büyük bir toplam olması gerekir. Bu Mayıs Ağustos tarihleri ​​arasında "çalıştırmak" için gerekiyor.

Ben bir gün ile bir hafta sonu ya da hafta içi bir gün olup olmadığını belirlemek olduğunu biliyoruz:

 $date = '2007/08/30';
 $weekday = date('l', strtotime($date));

Ay belirlemek için, ben SQL kullanmak, ve, örneğin, "10" dan "Ekim" almak için dava deyimi kullanabilirsiniz:

 SELECT MONTH(DATE_SPECIFIED);

Ben en çok emin değilim Ne olsa da, geçmesi ne süreçtir. Ben kolayca sorguları ALOT olabilir, ancak bu verimsiz. İdeal olarak, bir html tablosunda sonuçları baskı düşünüyordum.

Herkes bu konuda gitmek nasıl herhangi bir öneri / tavsiye edebilir miyim?

Teşekkürler.


EDIT:

Ben kullanıcıların bir tablo var ve bir eventcal tablo.

Burada kullanıcılar tablo:

 CREATE TABLE `users` (
  `fname` varchar(50) NOT NULL,
  `lname` varchar(50) NOT NULL,
  `role` varchar(75) NOT NULL,
  `region` tinyint(4) unsigned default NULL,
  `username` varchar(25) NOT NULL,
  `password` varchar(75) NOT NULL,
  `new_pass` varchar(5) default NULL,
  PRIMARY KEY  (`username`),
  KEY `role` (`role`),
  KEY `region` (`region`),
  CONSTRAINT `users_ibfk_2` FOREIGN KEY (`region`) REFERENCES `region` (`region`) ON UPDATE CASCADE,
  CONSTRAINT `users_ibfk_1` FOREIGN KEY (`role`) REFERENCES `role` (`role`) ON UPDATE CASCADE
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8

Ve burada eventcal tablo:

 CREATE TABLE `eventcal` (
  `id` int(11) NOT NULL auto_increment,
  `region` tinyint(3) unsigned NOT NULL,
  `primary` varchar(25) NOT NULL,
  `secondary` tinyint(1) NOT NULL,
  `eventDate` date NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `primary_2` (`primary`),
  CONSTRAINT `eventcal_ibfk_1` FOREIGN KEY (`primary`) REFERENCES `users` (`username`) ON DELETE CASCADE ON UPDATE CASCADE
 ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8

Bu evencal.primary users.username bir yabancı anahtar referansı vardır Not ...

2 Cevap

Sen (siz bir tarih tablo var, bir kullanıcı tablo varsayarsak, ve bir bağlantı tablo) .... yapmak gerekir

SELECT MONTH(eventDate), DAYOFWEEK(eventDate), 
COUNT(*) 
FROM eventcal as e 
LEFT JOIN users as u ON e.primary = u.username 
GROUP BY MONTH(eventDate), DAYOFWEEK(eventDate);

Bu ayda 7 satır kadar 3 kolonlarını her satır bir yük dönmelidir. Bir gün endeksi (1 = Pazar, 7 = Cumartesi), bir sayısal ay ve bir o güne bağlı kullanıcıların sayıdır.

Belirli ay kısıtlamak için gerekiyorsa, bir yerde madde de gibi ekleyebilirsiniz ...

WHERE eventDate BETWEEN '20090501' AND '20091001'

Ayrıca mysql de haftanın günde veya ayda toplamları dönmek zorunda tarafından grubundan sonra İLE toplamaları kelime kullanabilirsiniz. Ama bu geçerli satır toplam olup olmadığını belirlemek için mantık yazmak zorunda gibi, sık sık sizi kurtarır kullanımı daha sıkıcı bir durumdur.

EDIT:

Doğrudan haftasonu / hafta içi değerlerini almak istiyorsanız:

SELECT MONTH(eventDate), IF(WEEKDAY(eventDate)<5, 'weekday', 'weekend') AS DAY,
COUNT(*) 
FROM eventcal as e 
LEFT JOIN users as u ON e.primary = u.username 
GROUP BY MONTH(eventDate), IF(WEEKDAY(eventDate)<5, 'weekday', 'weekend');

Bu yukarıdaki gibi geri ama olacak Ayda sadece 2 satır, hafta içi için bir, hafta sonları için.

(Ben, ben size olabilir böyle bir hesaplanan değerine göre grup düsünebilirz üzere toplam emin değilim rağmen -! Denemek varsa bana bildirin)

MySQL, hafta içi () fonksiyonu vardır:

WEEKDAY (tarih)

Returns the weekday index for date (0 = Monday, 1 = Tuesday, … 6 = Sunday).

Sen ayda GROUP BY ile MySQL sorguda kullanmak gerekir.

Benim SQL bilgisi very paslı ve ben bu geçerli SQL olmadığından emin değilim, ama ondan özü almalısınız.

SELECT user, weekdaysPerMonth, month
FROM
(SELECT COUNT(*) AS weekdaysPerMonth, user, date, month
 FROM table
 WHERE WEEKDAY (tarih) > 0 AND WEEKDAY (tarih) < 5)
GROUP BY month