Doğru Cevap
-
Eğer ürünlerin değişmiyorsa, ya da az değişiyorsa hangi gün ne seçileceğini önceden bir kerelik hesaplayabilirsin:
ALTER TABLE your_table ADD COLUMN item_day INT DEFAULT 0;
Seçmek için:
select .... WHERE item_day = DATE_FORMAT('%j')
Seçerken sonuç gelmezse de aşağıdaki kod çalışsın:
<?php $qry = " UPDATE your_table SET item_day = 0"; $db->execute($qry); // You only need 355 item to set as item of the day for($i = 0; $i < 355; $i++) { $qry = "UPDATE your_table SET item_day = ".($i+1)." WHERE item_day = 0 ORDER BY RAND() LIMIT 1"; $rs = $db->execute($qry); // If no items left stop update if (!$rs) { break; } }
Cevaplar
-
ürünler tablsouna bi tane alan ekle: "günün_urunu_secildi" diye, günün ürünü seçildiği zaman update edersin. Günün ürününü de şöyle bir sql'le çekersin:
SELECT * FROM `table` WHERE gunun_urunu_secildi = 0 ORDER BY RAND() LIMIT 1;
(Not: rand() özellikle büyük tablolarda çok yavaş çalışır)-
omg-ponies
Aynen... 100.000+ satırlı bir tabloda biraz yük altında bile rand() epey yavaşlıyor...13 yıl önce yazılmış
-
-
sequence neden kullanmıyorsun? bence senin işini rahatlıkla görür...
-
lars
sequence ne bilmediğimden olabilir mi:)13 yıl önce yazılmış -
dinesh-atoliya
unique bir sayı üreten bir database objesi. Oracle destekliyor ama mysql'den emin değilim.13 yıl önce yazılmış
-
-
"order by rand" kullanmadan tablodan random bir satır çeken bir prosedür:
DROP PROCEDURE IF EXISTS random_iotd// CREATE PROCEDURE random_iotd() BEGIN # Tüm ürünler günün ürünü seçildiyse baştan başla SELECT COUNT(*) INTO @used FROM iotd WHERE used = 1; SELECT COUNT(*) INTO @rows FROM iotd; IF (@used = @rows) THEN UPDATE iotd SET used = 0; END IF; # 1 ile seçilmemiş satır adedi arasında bir random sayı üret SELECT FLOOR(RAND() * (@rows - @used)) INTO @rand; # Random sayıya denk gelen ürünün id'si PREPARE stmt FROM 'SELECT id INTO @id FROM iotd WHERE used = 0 LIMIT ?,1'; EXECUTE stmt USING @rand; # Ürün bilgilerini çek PREPARE stmt FROM 'SELECT id, item FROM iotd WHERE id = ?'; EXECUTE stmt USING @id; # Seçildi diye işaretle PREPARE stmt FROM 'UPDATE iotd SET used = 1 WHERE id = ?'; EXECUTE stmt USING @id; DEALLOCATE PREPARE stmt; END;
Kullanımı şööle:
CALL random_iotd();
Denediğim tablo:
CREATE TABLE `iotd` ( `id` int(11) NOT NULL AUTO_INCREMENT, `item` varchar(255) NOT NULL, `used` BOOLEAN NOT NULL DEFAULT 0, INDEX `used` (`used`), PRIMARY KEY (`id`) ) ENGINE=InnoDB;
PHP'den prosedürü de şu şekilde çağırabilirsin:
$mysqli = new mysqli('localhost', 'root', 'password', 'database'); $stmt = $mysqli->prepare('CALL random_iotd()'); $stmt->execute(); $stmt->bind_result($id, $item); $stmt->fetch(); echo "$id, $item\n"; // 4, Ürün açıklaması
-
lars
Bravo hocam çok sağol. Yalnız sorun şu ki daha önce hiç prosedür kullanmamıştım ve senin kodu phpMyAdmin'e copy paste yaptım. Hata vermedi ama prosedürü hiçbi yerde göremiyorum?13 yıl önce yazılmış -
mike
phpMyAdmin hiç kullanmam ben o yüzden emin değilim, desteklemiyor olabilir. mysql komut satırından çalışamıyor musun?13 yıl önce yazılmış -
MoneyGreen
Kodları denemedim ama çalışıyor gibi duruyor. Fakat yazarın gözünden kaçmış olabileceğini düşündüğüm bir yer var.
(@used = @rows) kontrol edilip tablodaki used alanları 0 olarak değiştirildikten sonra @used değişkeni de 0 olarak değiştirilmedi. Yoksa her ürün bir kez seçildikten sonra ilk günün ürününü seçekerken rastgele ürün yerine kaydedilen ilk ürün gelebilir veya farklı sonuçlar doğabilir.13 yıl önce yazılmış
-