【问题标题】:MySQL Query JOINS are not retrieving fullyMySQL 查询 JOINS 未完全检索
【发布时间】:2011-07-12 09:52:25
【问题描述】:

在我的网站上,我正在尝试编写一个类似于 facebook 和 twitter 时间线的功能,用户可以在其中“关注”另一个用户,并接收他们的“广播”。数据库表是:

**members**
--------
id
fullname
following

**broadcasts**
-----------
id
mem_id
broadcast (the content)
broadcast_date

members 表中的“following”是存储用户 ID 的 varchar 文本。因此,如果我关注用户 4 5 和 6 (4,5,6,) 将出现在以下列中。我的问题是,我从数据库中查询的内容只是从我关注的第一个用户那里检索“广播”,而没有其他用户。

$sql_broadcasts = mysql_query("
    SELECT *
    FROM members 
        JOIN broadcast 
            ON(broadcast.mem_id = members.following)
    WHERE members.id=$id
    ORDER BY broadcast_date DESC
    LIMIT 10;
");

其中 $id 是 $_SESSION['id']。我已经盯着这段代码很久了,谁能发现我做错了什么?提前谢谢

【问题讨论】:

  • 这个传说中的follower_array是什么?字段列表中未提及...
  • 表格描述难以阅读。是否所有内容都在“|”的一侧应该在一张桌子上?更好的是使用 SQL 模式语句 (CREATE TABLE) 来显示表结构。 Source code rules。正如 a'r 所提到的,您应该使用带参数的准备好的语句,而不是直接将值插入到语句中。准备好的语句更简单、更安全、更高效。
  • member.id 的类型是什么(整数或 varchar)?

标签: php mysql sql arrays


【解决方案1】:

联接不是这样工作的。

假设broadcast.mem_id 是数字类型,数据库将默默地投射members.follower_array;这将从 4,5,6 中得到 4,因此一条记录匹配。

你需要一个 m:n 关系才能工作,一个包含成员的表(你已经拥有);和另一个包含关注者的表,对于每个关注者,您插入一条记录,其中包含正在关注的成员的成员 ID 和正在关注的成员的成员 ID。这样一个成员可以有 0-n 个关注者。

Table member
id

Table follower
member_id
member_id_follower

然后你可以做类似的事情

SELECT
  ...
FROM
   member AS mb
JOIN
   follower AS fl ON fl.member_id = mb.id
WHERE
   mb.id = 123

【讨论】:

  • +1:同意。 OP 对following 字段的描述显示了对关系数据库设计的可能误解。使用映射表很有意义。
  • 是的,这是正确的做法。尽管如此,用某种列表成员资格测试替换 JOIN 中的相等测试是可能的(尽管效率可能非常低)。
【解决方案2】:

首先,您必须在子查询中获取所有以下 id 并将其传递给父查询!

$sql_broadcasts = mysql_query("SELECT *
FROM broadcast where mem_id IN( Select following from members where id = $id)
ORDER BY broadcast_date DESC
LIMIT 10;
");

其中以下字段包含所有以下 id 逗号拆分,例如 4,5,6

【讨论】:

    猜你喜欢
    • 2016-10-24
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多