我有一张表如下
Ads Table
user_id ad_id title message repost_days_id repost_times_id
1 1 Message Title 1 Message 1 1
1 1 Message Title 2 Message 0 0
Repost Days Table:
repost_days_id Value
1 5
Repost Times Table:
Repost_times_id value
1 10
现在,我想查询广告表,以显示广告标题广告消息重新发布天数和转贴时间。例如,对于广告1,它将是
Message Title 1
Message Repost Days=10
Repost Times=5.
如何为此编写sql语句?这就是我所做的,并没有显示任何结果。
$q = "
select
a.ad_id,
a.title,
a.message,
rt.value,
rd.value,
from
ad_repost_times rt,
ad_repost_days rd,
ads a
where
a.user_id='{$_SESSION['user_id']}'
and rt.repost_times_id=a.repost_times_id
and rd.repost_days_id=a.repost_days_id
";
答案 0 :(得分:1)
查询无法满足a.user_id='{$_SESSION['user_id']}'
条件,因为user_id
表中没有ads
字段。
答案 1 :(得分:1)
您似乎在字段列表的末尾有一个额外的逗号。这将导致首先执行查询时出现问题。在尝试运行可提醒您解决问题的查询后,请确保检查错误。
您的a.user_id='{$_SESSION['user_id']}'
表示在SQL查询中提交用户ID时会有大括号。如果$_SESSION['user_id']
包含整数1234,则您的查询将显示为a.user_id='{1234}'
。 (请注意,如果您的代码中出现相同的错误,则此“错误”可能实际上不是导致问题的原因。)
以下不是问题的直接原因,但出于安全原因这很重要,它可以避免#2中的问题:您需要删除变量替换a.user_id='{$_SESSION['user_id']}'
,并将其更改为与a.user_id=?
绑定的参数,以避免SQL注入攻击(同时也巧妙地消除了导致问题#2的错误)。
要在repost_days_id
,repost_times_id
中处理默认值零,您需要使用LEFT JOIN
,如下所示:
$q = "
select
a.ad_id,
a.title,
a.message,
rt.value,
rd.value
from
ads a
LEFT JOIN ad_repost_times rt ON rt.repost_times_id=a.repost_times_id
LEFT JOIN ad_repost_days rd ON rd.repost_days_id=a.repost_days_id
where
a.user_id='{$_SESSION['user_id']}'
";
对于ID为0的行,rt.value
和rd.value
的结果将为null。
请注意,我已对表格进行了重新排序(ads a
需要先出现,否则您需要在某些地方使用RIGHT JOIN
而不是LEFT JOIN
),并且不再需要表名之间的逗号。 (LEFT JOIN
替换逗号)。
答案 2 :(得分:0)
执行此查询时没有任何错误吗?
从您的表格结构中,广告表似乎没有字段user_id
而您正在查询