【问题标题】:Take decision on field value and fetch records from different tables决定字段值并从不同的表中获取记录
【发布时间】:2014-01-10 05:43:40
【问题描述】:

我在数据库中有 2 个表。

表 1:用户 id, name, email, password, singleCourse, userType,

表 2:用户课程 id, fk_user_id, course_name

userType 可以是 1 或 2。

现在如果 userType = 1

继续从用户表中获取。

如果 userType = 2

从包含多条记录的 userCourses 表中获取。

在查询逻辑方面需要帮助。

除非有需要,否则查询不应从 userCourses 表中获取记录。

可以使用 CASE WHEN THEN 来完成吗?

这是我尝试过的:

$query = mysql_query("SELECT name.user,email.user,password.user,userType.user,
fk_user_id.course,course_name.course 
FROM  CASE userType.user WHEN 1 THEN FROM users.u 
WHEN 2 THEN users.user INNER JOIN userCourses.course 
ON (user.id = userCourses.fk_user_id)");

样本数据:

用户课程

1, John, john@test.com, 123456, 1, PHP
2, Nick, nick@test.com, 654321, 2, ''

用户课程:

1, 2, JAVASCRIPT
2, 2, C++
3, 2, Jquery

所需的输出:

我只是想获取用户课程,但使用所需的表,如果 usertype = 1,查询不应该转到另一个表来检查记录

【问题讨论】:

  • 我试过 CASE 但我没有得到语法
  • 你能告诉我们一些你试过的代码吗?
  • 至少提供样本数据和期望的输出
  • 好的,我提供查询
  • @peterm 请查看我的帖子

标签: php mysql


【解决方案1】:

我已经发布了如下示例查询,根据您的要求进行修改

SELECT
(CASE field1
WHEN 'A' THEN 'value is A'
WHEN 'B' THEN 'value is B'
ELSE 'value is neither A or B'
END)
FROM your_table;

SELECT
(CASE
WHEN (field1 IS NULL) THEN 'value is NULL'
WHEN (field1 = 1) THEN 'value is 1'
ELSE 'value is neither NULL or 1'
END)
FROM your_table;

【讨论】:

  • 您没有在查询中提到第二个表。请查看我更新的帖子
【解决方案2】:

虽然您由于未知原因没有提供所需的输出,但您似乎只需要这个

SELECT u.id, u.name, u.email, u.password, u.userType, 
       COALESCE(NULLIF(u.singleCourse,''), c.course_name) course
  FROM users u LEFT JOIN userCourses c
    ON u.id = c.fk_user_id

SELECT id, name, email, password, userType, singleCourse course
  FROM users
 WHERE usertype = 1
UNION ALL
SELECT u.id, name, email, password, userType, c.course_name
  FROM users u JOIN userCourses c
    ON u.id = c.fk_user_id
 WHERE usertype = 2

样本输出:

+------+------+----------------+----------+-------- --+------------+ |编号 |姓名 |电子邮件 |密码 |用户类型 |课程 | +------+------+----------------+----------+-------- --+------------+ | 2 |尼克 | nick@test.com | 654321 | 2 | JAVASCRIPT | | 2 |尼克 | nick@test.com | 654321 | 2 | C++ | | 2 |尼克 | nick@test.com | 654321 | 2 | jQuery | | 1 |约翰 | john@test.com | 123456 | 1 | PHP | +------+------+----------------+----------+-------- --+------------+

这里是SQLFiddle演示

【讨论】:

  • 在您的查询中,控件每次都会检查 userCourse 表中的记录,即使 userType = 1
  • 您的输出生成完美,但逻辑对我没有帮助。因为我必须在不同的表中采取不同的条件
  • 1) 您不能有条件地连接表。 2)在我的第一个示例中,它将仅连接外部连接右侧的现有行。它不会以任何方式影响性能。
  • 基本上它会损害我的性能。因为我在查询中做了很多计算。而且那个查询+数据也是保密的。所以我必须在 userType = 1 上取一个条件,在 userType = 2 上取一个不同的条件
  • 再一次它不会受到伤害(在你说之前先做基准测试)。但无论如何,如果您不想使用外部连接,您的 only 赌注是UNION,如我的第二个示例所示,如果您需要组合结果集。这样您就可以独立处理它,然后合并结果集。
【解决方案3】:

更新的帖子/代码:

<?php
 $query = mysqli_query("SELECT userType from user") or die("err:". mysqli_error());  
 $x = 1; 
 while($row = mysqli_fetch_array($query))
 {
    $userType[$x] = $row['userType']; // fetch all the userType in your table and put in an array
    $x++;
 }

for($x = 1; $x <= count($userType); $x++)
 { 

      if($userType[$x]="1") // determines if the user is "1" 
      { 
         $query = mysqli_query("SELECT * FROM user") or die("Error" . mysqli_error());
      }
      else
      { 
            $query = mysqli_query("SELECT u.*, c.* FROM user u LEFT OUTER JOIN userCourse c ON u.id = c.fk_user_id") or die(mysqli_error());
      }

      while(mysqli_fetch_array($query))
      {
        //code here whatever data you want to show
      }
 }

希望这会有所帮助。为之前的代码道歉。

【讨论】:

  • 你是如何得到 $userType 值的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 2017-04-09
  • 2014-01-06
相关资源
最近更新 更多