簡體   English   中英

當日期更改時,如何確保從廣播歷史中的歌曲歷史數據庫中插入歌曲而沒有重復?

[英]How to make sure to insert songs in songhistory database from shoutcast history without duplicates when date changes?

我正在從廣播服務器獲取最近播放的10首歌曲,並希望將它們插入我的數據庫中,以便跟蹤在特定日期和時間播放的歌曲。

這是表的結構:

`id_played`     int(11)        AUTO_INCREMENT
`date_played`   date
`time_played`   time
`artist`        varchar(255)
`title`         varchar(255)

這是我將歌曲插入表中的代碼:

$date = date("Y-m-d");

for($i = 0; $i < $songsCount; $i++) {
    $stmtGetExisting = $mysqli->prepare("SELECT id_played FROM played WHERE date_played = ? AND time_played = ? AND artist = ? AND title = ?");
    $stmtGetExisting->bind_param("ssss", $date, $times[$i], $artists[$i], $titles[$i]);
    $stmtGetExisting->execute();
    $stmtGetExisting->store_result();
    $rows = $stmtGetExisting->num_rows;

    if($rows == 0) {
        $stmtInsertSong = $mysqli->prepare("INSERT INTO played SET date_played = ?, time_played = ?, artist = ?, title = ?");
        $stmtInsertSong->bind_param("ssss", $date, $times[$i], $artists[$i], $titles[$i]);
        $stmtInsertSong->execute();
    }
}

我想使用cronjob運行此腳本以自動保留所有已播放歌曲的歷史記錄,因此該腳本將非常頻繁地執行。

在大多數情況下,它運行良好,但是如果日期從2015年2月23日更改為2015年2月24日,則將再次插入日期更改之前播放的歌曲,但帶有新日期。

確保不再次插入在日期更改之前播放的歌曲的最佳方法是什么?

聽起來正在發生的事情是,您正在從服務器獲取歌曲的播放時間,但是使用當前日期作為播放日期。 在這種情況下,您可以按如下所示修改腳本:

$date = date("Y-m-d");
$time = date("H-i-s");

for($i = 0; $i < $songsCount; $i++) {
    //since the time is was played would be later then the current time (only time, not
    //datetime) you can check if the pulled time is greater then the current time

    if($time < $times[$i]) continue;

    $stmtGetExisting = $mysqli->prepare("SELECT id_played FROM played WHERE date_played = ? AND time_played = ? AND artist = ? AND title = ?");
    $stmtGetExisting->bind_param("ssss", $date, $times[$i], $artists[$i], $titles[$i]);
    $stmtGetExisting->execute();
    $stmtGetExisting->store_result();
    $rows = $stmtGetExisting->num_rows;

    if($rows == 0) {
        $stmtInsertSong = $mysqli->prepare("INSERT INTO played SET date_played = ?, time_played = ?, artist = ?, title = ?");
        $stmtInsertSong->bind_param("ssss", $date, $times[$i], $artists[$i], $titles[$i]);
        $stmtInsertSong->execute();
    }
}

如果您只想存儲播放歌曲的第一個日期,則可以在artist + title列上放置一個索引,並使用“ ON DUPLICATE KEY” mysql條件來更新計數器。 這樣,您也可以刪除選擇查詢以檢查記錄是否存在,因為索引將為您檢查它。

您需要三個表才能正確處理這種要求。 第一個表僅包含藝術家屬性,第二個表僅包含歌曲屬性,第三個表僅包含執行屬性。 歌手表的主鍵應該是歌手名稱或您的外部提供商的鍵。 歌曲表的鍵必須是復合鍵,包括藝術家pk和歌曲名稱。 藝術家必須是外鍵。 執行鍵必須是復合鍵,使用歌曲pk加上執行日期時間。 進入計算機后,我將嘗試進行設計。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM