0

メンバーの 15 枚のプロフィール写真のリストを表示しようとしています。

という列がありsettings、次のようになります。0, 1, 1, 1

1上記の最初の番号が の人物の写真のみを表示する必要があります。

1人を直接取得することはできないためWHERE the first number、数に関係なく全員を取得する必要があります。次に、1セット持っている人だけを表示します。(クエリでここで問題を解決する方法はありますか?)

私のメンバーの約 20% が0この数字を持っているので、私のクエリでLIMITは 15 よりも大きい値を設定する必要があります (今は 30 に設定しています。そうしないと 15 に設定すると、写真が 15 枚未満のリストになります)。

ただし、リストには正確に 15 人を表示する必要があり、多くの場合、15 人から 30 人の間になります (制限 = 30 のため)。

for / while ループを使用してみましたが、どこに配置すればよいかわかりません。

私のコードは次のようになります。

    $query = $conn->prepare("SELECT picture_path, profile_picture, username, last_visit, signup_date, settings FROM tusers 
                WHERE profile_picture IS NOT NULL 
                AND sex = 1 
                AND  last_visit BETWEEN CURDATE() - INTERVAL 9 DAY AND CURDATE() 
                AND signup_date < CURDATE() - INTERVAL 10 DAY 
                ORDER BY RAND()
                LIMIT 30");
    $query->execute();
    $members_results = $query->fetchAll(PDO::FETCH_ASSOC);

    foreach ($members_results as $key => $member) {
        $meet_new_people_enabled = explode(",", $member['settings']);

        if ($meet_new_people_enabled[0] == '1') {
            $picture_path = "http://www.mySite.com/" . $member['picture_path'] . "/" . $member['profile_picture']; 
            echo '<figure class="member"><a href="' . $member['username'] . '"><img src="' . $picture_path . '" title="' . $member['settings'] . '" width="100" height="100" /></a></figure>';
        }
    }

正確に 15 人が表示されるようにするには、これをどのように解決しますか?

ありがとうございました

4

1 に答える 1

0

データの保存方法が間違っています。

データベース設計 (より正式には第 1 正規形または 1NF として知られる) の基本ルールは、すべての列が 1 つのデータのみを保持する必要があることです (より正式には、すべてのデータはアトミックでなければなりません)。

CSV データは、その性質上、アトミックではありません。コンマで区切られたリストに格納された値の数です。そのようなデータがある場合、今発見したように、操作とクエリが困難になります。

従属テーブルの設定列にデータを配置し、外部キーを使用してプライマリ テーブルの行に関連付けることにより、データを正規化する必要があります。

これがオプションでない場合は、少なくとも各設定値の列が必要です。

于 2013-09-24T11:35:25.443 に答える