Mysql Multiple Table查询语句

时间:2011-05-23 13:29:49

标签: mysql

我有一张表如下

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
";

3 个答案:

答案 0 :(得分:1)

查询无法满足a.user_id='{$_SESSION['user_id']}'条件,因为user_id表中没有ads字段。

答案 1 :(得分:1)

  1. 您似乎在字段列表的末尾有一个额外的逗号。这将导致首先执行查询时出现问题。在尝试运行可提醒您解决问题的查询后,请确保检查错误。

  2. 您的a.user_id='{$_SESSION['user_id']}'表示在SQL查询中提交用户ID时会有大括号。如果$_SESSION['user_id']包含整数1234,则您的查询将显示为a.user_id='{1234}'。 (请注意,如果您的代码中出现相同的错误,则此“错误”可能实际上不是导致问题的原因。)

  3. 以下不是问题的直接原因,但出于安全原因这很重要,它可以避免#2中的问题:您需要删除变量替换a.user_id='{$_SESSION['user_id']}',并将其更改为与a.user_id=?绑定的参数,以避免SQL注入攻击(同时也巧妙地消除了导致问题#2的错误)。

  4. 要在repost_days_idrepost_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.valuerd.value的结果将为null。

    请注意,我已对表格进行了重新排序(ads a需要先出现,否则您需要在某些地方使用RIGHT JOIN而不是LEFT JOIN),并且不再需要表名之间的逗号。 (LEFT JOIN 替换逗号)。

答案 2 :(得分:0)

执行此查询时没有任何错误吗?

从您的表格结构中,广告表似乎没有字段user_id而您正在查询