【问题标题】:SELECT * FROM table1 INNER JOIN table2 ON table1.id=table2.id WHERE clauseSELECT * FROM table1 INNER JOIN table2 ON table1.id=table2.id WHERE 子句
【发布时间】:2014-05-02 13:23:59
【问题描述】:

我在连接两个带有 WHERE 子句的表时遇到问题,其中涉及 monthname(date)='$month'..

**tbl_dv**
dv_id, number, net, respo, date_added 

**tbl_payroll**
pr_id, dv_id, number, pr_date, roll1, roll2, roll3, roll4, roll5, roll6 date_added.

我想添加ROLLS 列并在view.php 上查看它。比如:$total=(roll1 + roll2 + roll3 + roll4 + roll5 + roll6);如何做到这一点并以独特的方式插入它。

$viewrecord = "SELECT * FROM tbl_dv WHERE respo='".mysql_real_escape_string($data[0])."' && year(date_added)='$year' && month(date_added)='$month'";

【问题讨论】:

  • 通过查看列roll1 ... roll6,在我看来你没有normalize db design
  • @Krister Andersson 对不起。我在赶东西。虽然这个系统已经在运行。但是我已经给了时间我会修补并规范这个数据库设计。现在我正在寻求帮助.. 非常感谢您的 cmets。如果您想生病,请将设计虚拟系统发送给您,以便您可以动手操作..
  • 颠倒你的逻辑会更有效率。此外,每当我看到名为 x1、x2 等的列时,警钟就会开始响起,而不是标准化(或缺乏标准化)!

标签: php mysql join inner-join


【解决方案1】:

你可以做一个 -

$viewrecord = "SELECT *, (roll1 + roll2 + roll3 + roll4 + roll5 + roll6) as total FROM tbl_dv join tbl_payroll on tbl_dv.dv_id = tbl_payroll.dv_id WHERE respo='".mysql_real_escape_string($data[0])."' && year(date_added)='$year' && month(date_added)='$month'";

【讨论】:

  • 我已经尝试过这段代码,但我有这个错误列'respo' in where 子句不明确。
  • 改成 tbl_dv.respo
【解决方案2】:
<?php require_once('../includes/connection.php');?>
<?php require_once('../includes/header.php');?>

<?php
$color="1";
$respo = $_GET['respo'];
$data = explode("+", $respo);
$month = date("m", strtotime($data[1])) . "<br />";
$year = date("Y", strtotime($data[1])) . "<br />";

**$viewrecord = "SELECT *, (pr.roll1 + pr.roll2 + pr.roll3 + pr.roll4 + pr.roll5 + pr.roll6) AS rolls FROM tbl_payroll dv join tbl_payroll pr on pr.dv_id = dv.dv_id WHERE dv.respo='".mysql_real_escape_string($data[0])."' && year(dv.date_added)='$year' && month(dv.date_added)='$month'";**
$run_viewrecord = mysql_query($viewrecord) or die(mysql_error());

{
echo "<table border='1' width='100%' style='border:1px solid silver' cellpadding='5px' cellspacing='0px'>
<tr bgcolor='#666666' style='color:#FFFFFF'>
<th>Date Encoded</th>
------------HEADER--------- etc....

-------THERE SHOULD BE A IF STATEMATE HERE-----------------
(where if no records match "dv.dv_id=pr.pr.dv_id". It would still display records from tbl_dv..)

while ($row = mysql_fetch_row($run_viewrecord)) {

if($color==1){
echo "<tr bgcolor='#ffffff'>";
echo "<td align='center'>" .date_format(date_create($row[17]), "m/d/y")."</td>
**--------- I WANT TO DISPLAY THE ROLLS HERE --------------------**
echo "</td></tr>";

$color="2";
}   else {
echo "<tr bgcolor='#ebeaea'>";
echo "<td align='center'>" .date_format(date_create($row[17]), "m/d/y")."</td>
**--------- I WANT TO DISPLAY THE ROLLS HERE --------------------**
echo "</td></tr>";

$color="1";
}
}
echo '</table>';
echo '<td><tr><table><br /><br />';
}
?>

我希望在 WHILE 之前添加一个 IF 语句。即使两个 table2 上都没有匹配的 dv_id,它仍然会显示记录。它仍应显示记录。如果不匹配,COLUMN ROLLS 将显示 0.00 值。友情链接>> http://i599.photobucket.com/albums/tt79/emcevo/viewphpdisplay_zpsfc6a8174.jpg

【讨论】:

    【解决方案3】:

    您可以通过将 PHP 中每个记录行的返回值相加来以编程方式完成此操作。

    你也可以这样做

     $viewrecord = "SELECT *, (pr.roll1 + pr.roll2 + 
                    pr.roll3 + pr.roll4 + pr.roll5 + pr.roll6) as rolls 
     FROM tbl_dv dv LEFT OUTER JOIN tbl_payroll pr on dv.dv_id = pr.dv_id 
     RIGHT OUTER JOIN tbl_payroll pr on dv.dv_id = pr.dv_id 
     WHERE dv.respo='".mysql_real_escape_string($data[0])."' 
     && year(dv.date_added)='$year' && month(dv.date_added)='$month'";
    

    【讨论】:

    • 卷来自不同的桌子。我试过这个..我得到了这个错误。 where 子句中的列“respo”不明确
    • 更新了我的答案。您也不应该使用 select *,而是唯一标识您想要返回的列。但是,我不知道你想要什么列。
    • 当我更新它时。它显示没有记录。我会寄给你一个虚拟系统和数据库。如果你没问题?
    • 没有记录意味着 dv.dv_id 和 pr.dv_id 之间没有匹配项,或者没有匹配您的 where 子句。
    • 你的权利。发生的情况是,在 tbl_dv 中有记录,而在 tbl_payroll 中没有。但现在是个大问题。该记录仅在两个表上都有匹配记录 dv_id 时才会显示。现在,当没有记录匹配时,它不会显示任何内容。 :( 我想要的只是添加 ROLLS 列以显示总滚动数。不消失不匹配的记录..
    猜你喜欢
    • 2011-02-07
    • 1970-01-01
    • 2014-06-17
    • 2015-01-26
    • 2018-12-04
    • 1970-01-01
    • 2010-10-20
    • 2017-11-15
    • 2023-02-13
    相关资源
    最近更新 更多