0

我正在尝试显示来自我的成员的 15 张个人资料图片的列表。

有一个名为 的列settings,看起来像0, 1, 1, 1

1我必须只显示上面第一个数字为a 的人的图片。

由于我不能直接取人WHERE the first number是 1,所以我必须取每个人,无论人数多少。然后,我将只显示拥有 1 组的人。(有什么方法可以在查询中解决问题吗?)

大约 20% 的成员有一个0这个数字,所以在我的查询中,我必须设置一个LIMIT高于 15 的值(我现在将其设置为 30,否则在 15 时我会得到一个少于 15 张图片的列表)。

但是,我必须在列表中准确显示 15 人,并且通常在 15-30 之间结束(因为 limit = 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

您存储数据错误。

数据库设计的基本规则(更正式地称为第一范式或 1NF)是每列应包含 1 且仅 1 条数据(更正式地,所有数据必须是原子的)。

CSV 数据本质上不是原子的。它是存储在以逗号分隔的列表中的多个值。正如您刚刚发现的那样,如果您有这样的数据,您将难以操作和查询它。

您应该通过将数据放在依赖表的设置列中并将其与主表中的行与外键相关联来规范化您的数据。

如果这不是一个选项,您至少应该为每个设置值设置一列。

于 2013-09-24T11:35:25.443 回答