2011-05-23 176 views
0

请有人可以帮我用这个sql语句。我有一个表如下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 
"; 
+0

你可以发现在转播日和转播时间的表,还有价值0.1没有ID,但在广告表格,无论是repost_days_id和repost_times_id已经被设置为默认值为0。你认为这会影响查询。 – stanley 2011-05-23 13:52:46

回答

0

此查询是否执行无误?

从你的表结构似乎广告表没有现场user_id和您要查询就可以了

1

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

+0

我忽略了user_id字段。它在表 – stanley 2011-05-23 13:46:07

1
  1. 看起来您在字段列表末尾有一个额外的逗号。这首先会导致执行查询的问题。在尝试运行查询以提醒您问题后,请确保您正在检查错误。

  2. 您的a.user_id='{$_SESSION['user_id']}'表示当您在SQL查询中提交时,您的用户标识将会出现大括号。如果$_SESSION['user_id']保存整数1234,那么您的查询将看起来像a.user_id='{1234}'。 (请注意,如果您在整个代码中发生相同的错误,则此“错误”实际上可能不是问题的原因。)

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

  4. 要在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']}' 
    "; 
    

    rt.valuerd.value的结果将是空的有0对行ID。

    请注意,我已经重新排序表(ads a需要是第一位的,否则你需要使用在某些地方代替LEFT JOINRIGHT JOIN),而应该不再是表名之间的逗号。 (LEFT JOIN替换为的逗号)。

+0

你好肯,感谢您的反馈。我在最后一个字段查询中删除了多余的逗号,现在显示结果。但是,它并未显示repost_days_id和repost_times_id已设置为默认值0的表的结果。由于各个转发日和转发时间表中没有0值。我如何解决这个问题。我不想在这些表中添加0。 – stanley 2011-05-23 14:49:13

+0

我要编辑我的答案来讨论这个问题。 – 2011-05-23 16:14:17

+0

非常感谢。你的解释真的帮助了我。我如何实现这个“你需要删除变量替换a.user_id ='{$ _ SESSION ['user_id']}',并将其改为与a.user_id =?绑定的参数” – stanley 2011-05-23 18:03:21