【问题标题】:Mysql filter query from drop down box下拉框中的Mysql过滤查询
【发布时间】:2013-01-07 11:27:34
【问题描述】:

早上好,我有下面的 mysql 查询来显示销售情况良好的年份,直到年份发生变化,因为它现在显示 2012 年 1 月和 2013 年 1 月的组合。

为了尝试解决,我放置了一个下拉表单框 (id=YearSelect),其值为 2012 和 2013,是否可以使用所选值控制此查询?如果最终用户选择 2012,那么该值将作为 where 子句的类型发送到 Year 列?

<form id="yearselect">
<select name="year">
  <option value="">Select year </option>
  <option value="2012">2012</option>
  <option value="2013">2013</option>
</select>
</form>


Select
  *,
  If(q.Adviser Is Null, 1, 0) As remove
From
  (Select
      a.ContactFullName As Adviser,  
      YEAR(b.CaseDate) As Year,
      Sum(If(Month(b.StatusSubmittedDate) = 1, b.CaseCommission, 0)) As Jan,
      Sum(If(Month(b.StatusSubmittedDate) = 2, b.CaseCommission, 0)) As Feb,
      Sum(If(Month(b.StatusSubmittedDate) = 3, b.CaseCommission, 0)) As Mar,
      Sum(If(Month(b.StatusSubmittedDate) = 4, b.CaseCommission, 0)) As Apr,
      Sum(If(Month(b.StatusSubmittedDate) = 5, b.CaseCommission, 0)) As May,
      Sum(If(Month(b.StatusSubmittedDate) = 6, b.CaseCommission, 0)) As Jun,
      Sum(If(Month(b.StatusSubmittedDate) = 7, b.CaseCommission, 0)) As Jul,
      Sum(If(Month(b.StatusSubmittedDate) = 8, b.CaseCommission, 0)) As Aug,
      Sum(If(Month(b.StatusSubmittedDate) = 9, b.CaseCommission, 0)) As Sep,
      Sum(If(Month(b.StatusSubmittedDate) = 10, b.CaseCommission, 0)) As Oct,
      Sum(If(Month(b.StatusSubmittedDate) = 11, b.CaseCommission, 0)) As Nov,
      Sum(If(Month(b.StatusSubmittedDate) = 12, b.CaseCommission, 0)) As Decb,
      Sum(b.CaseCommission) As Total
    From
      tblcontacts a Inner Join
      tblcases b On a.ContactID = b.ContactAssignedTo
    Where
      WHERE Year(b.StatusSubmittedDate) = ".(int)$_POST['year']."
    Group By
      a.ContactFullName WITH ROLLUP
    Having
      Sum(b.CaseCommission) > 0.01) q
Order By
  If(q.Adviser Is Null, 1, 0), q.Total Desc

任何建议表示赞赏。

【问题讨论】:

  • 那不是 PHP。为什么这个问题被标记为 PHP?

标签: mysql


【解决方案1】:

如何改变这个WHERE

Where
  b.StatusSubmittedDate > '2012 - 01 - 01'

到:

Where
  YEAR(b.StatusSubmittedDate) = ".(int)$YEAR_VALUE_FROM_DROPDOWN."

应该够了……

【讨论】:

  • 感谢您的建议,不过我可能实施错了。更新的代码现在在原始帖子中,但这会返回“注意:未定义的变量:C:\wamp\sales.php 中的 SelectYear 在第 41 行”。猜测它不是 where 语句中需要的表单字段的 id?
  • @gary 不,这不是表单的 ID,您必须从 $_POST$_GET 数组的组合框中提供正确的值。假设组合框字段的名称是year(因此有&lt;select name="year"&gt;...&lt;/select&gt;)并且您正在发布表单,那么WHERE 将是:Where YEAR(b.StatusSubmittedDate) = ".(int)$_POST['year']."
  • 也尝试过该代码并反映在我的原始帖子中,但我也收到“通知:未定义索引:年份”。无法解决这个问题,'YEAR(b.StatusSubmittedDate)' 的输出在我的查询中始终是 2012 或 2013,这是正确的,所以我猜它是无法定位的选择值?
  • @gary 发布您的表单的代码,其中存在选择,以及您收到提交的值的 PHP 代码...
  • 嗨@shadyyx,再次感谢您设法解决了这个问题,当页面第一次加载时,过滤器没有值,所以它会出错。当我选择一年时,它会正确过滤查询,直到加载下一页。不知何故需要找到如何使 2013 年成为页面加载的默认年份。
【解决方案2】:

考虑到 PHP 标记,我假设您在 PHP 基础页面上显示结果。你可以使用下面的代码来做你想做的事。

<form id="yearselect" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" >
<select name='selyear' onchange='document.getElementById("yearselect").submit()'>
  <option value=''> - Select year </option>
  <option value='2012'>2012</option>
  <option value='2013'>2013</option>
</select>
</form>

<?
$y = date("Y");
if (isset($_POST['selyear']))
{
  if (checkdate(1, 1, $_POST['selyear']) && $_POST['selyear']>=2012)
    $y = $_POST['selyear'];
}

$query = 'Select
  *,
  If(q.Adviser Is Null, 1, 0) As remove
From
  (Select
      a.ContactFullName As Adviser,  
      YEAR(b.CaseDate) As Year,
      Sum(If(Month(b.StatusSubmittedDate) = 1, b.CaseCommission, 0)) As Jan,
      Sum(If(Month(b.StatusSubmittedDate) = 2, b.CaseCommission, 0)) As Feb,
      Sum(If(Month(b.StatusSubmittedDate) = 3, b.CaseCommission, 0)) As Mar,
      Sum(If(Month(b.StatusSubmittedDate) = 4, b.CaseCommission, 0)) As Apr,
      Sum(If(Month(b.StatusSubmittedDate) = 5, b.CaseCommission, 0)) As May,
      Sum(If(Month(b.StatusSubmittedDate) = 6, b.CaseCommission, 0)) As Jun,
      Sum(If(Month(b.StatusSubmittedDate) = 7, b.CaseCommission, 0)) As Jul,
      Sum(If(Month(b.StatusSubmittedDate) = 8, b.CaseCommission, 0)) As Aug,
      Sum(If(Month(b.StatusSubmittedDate) = 9, b.CaseCommission, 0)) As Sep,
      Sum(If(Month(b.StatusSubmittedDate) = 10, b.CaseCommission, 0)) As Oct,
      Sum(If(Month(b.StatusSubmittedDate) = 11, b.CaseCommission, 0)) As Nov,
      Sum(If(Month(b.StatusSubmittedDate) = 12, b.CaseCommission, 0)) As Decb,
      Sum(b.CaseCommission) As Total
    From
      tblcontacts a Inner Join
      tblcases b On a.ContactID = b.ContactAssignedTo
    Where
      b.StatusSubmittedDate > \''.$y.' - 01 - 01\'
      AND b.StatusSubmittedDate < \''.$y.' - 12 - 31\'
    Group By
      a.ContactFullName WITH ROLLUP
    Having
      Sum(b.CaseCommission) > 0.01) q
Order By
  If(q.Adviser Is Null, 1, 0), q.Total Desc'


  //output results
?>

现在我没有检查您的查询,因为您提到它有效。此外,除了在更改选择列表时发布表单,您还可以将其更改为使用 AJAX 或任何使其更好的方法。但我想你明白了。

我现在还要检查一个有效的年份,而不仅仅是 2012 年或 2013 年。这取决于你想要什么。

【讨论】:

  • 感谢您的意见,非常感谢 Hugo。此代码还返回一个未定义的变量:年份,页面错误为 '\''..' - 01 - 01\' AND b.StatusSubmittedDate
  • 我的错误,我在发帖中途从$year 切换到$y 并忘记更新一些。我更新了它。现在应该可以工作了。
  • 没问题雨果,我也没看到!已进行更改,但仍然看到错误,例如“您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取在 '\''.2013 附近使用的正确语法。” - 01 - 01\' AND 年(b.StatusSubmittedDate)
  • 那么您没有使用 $query 来运行代码,而是复制了查询并将其放在双引号之间,而不是我使用的单引号之间。您可以将其更改为单引号或将行更改为b.StatusSubmittedDate &gt; '$y - 01 - 01' AND b.StatusSubmittedDate &lt; '$y - 12 - 31'
  • 谢谢 Hugo,在我看到你的帖子之前,我已经实施了另一个现在可以工作的解决方案,我可以感谢你在这方面的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-05-01
  • 1970-01-01
相关资源
最近更新 更多