【问题标题】:What join should I use with MySQL? [closed]我应该在 MySQL 中使用什么连接? [关闭]
【发布时间】:2017-08-11 02:14:17
【问题描述】:

我正在从事一个计算项目,并被要求使用连接查询从两个不同的表中获取信息。我想从两个表中的一行中获取所有值。我使用唯一的 id 来识别每一行。

if(isset($_GET['edit'])){
    $savingsId = $_GET['savingsId']; // To use to get other stuff
    $sql="SELECT Savings_Allocation.Bank,Savings_Allocation.TotalAmt,Savings_Allocation.Interest,Savings.Type,Savings.Access
          FROM Savings_Allocation,Savings
          INNER JOIN Savings
          WHERE Savings.savingsId AND Savings_Allocation.savingsId = '$savingsId'";
    $res = mysql_query($sql);
    $row = mysql_fetch_array($res);

我查看了现有示例,但它们似乎有点令人困惑/不回答我正在尝试做的事情。

【问题讨论】:

  • 您不应该在新代码中使用mysql_* 函数。学习 PDO 或 MySQLi 以及如何使用参数化查询。

标签: php mysql join


【解决方案1】:

您的查询中有一些小错误。在“从”部分中,您只需要使用第一个表,并且您需要告诉连接第一个表中的哪个字段与第二个表中的哪个字段匹配。在其中您只需将一个字段匹配到$savingsId

这个查询应该可以工作:

SELECT Savings_Allocation.Bank,Savings_Allocation.TotalAmt,Savings_Allocation.Interest,Savings.Type,Savings.Access
FROM Savings_Allocation
INNER JOIN Savings ON Savings.savingsId = Savings_Allocation.savingsId
WHERE Savings.savingsId = '$savingsId'

现在上面的查询有最后一个缺陷:在查询字符串中使用变量是不安全的,并且使查询容易受到 SQL 注入。所以请阅读PHP's guide on SQL injection 了解如何进行安全查询。并且不要使用mysql_query,因为它自 php 5.5 起已被弃用,甚至在 PHP 7 中被删除。建议使用 mysqliPDO

【讨论】:

    【解决方案2】:

    以下是关于学生和付款这两个表的所有可能查询。

    students  name        id  id_student datepayment
    1         Lisa         1    1        2017-01-01
    2                      2    1        2017-02-03
    3         Asher        3    2        2017-03-05
    4         Lee          4    1        2017-03-03
    

    查询

    select students.name, payment.datepayment
    FROM students, payment
    where students.id_student = payment.id_student;
    

    将给出这个结果 - 所有学生的名字在表支付中都有 id_student

    name    datepayment
    Lisa    2017-01-01
    Lisa    2017-02-03
    Lisa    2017-03-03
            2017-03-05
    

    查询

    SELECT s.name, p.datepayment
    FROM
    students s
    LEFT OUTER JOIN payment p ON s.id_student = p.id_student;
    

    将给出这个结果:LEFT 表中的所有学生姓名(学生)在表支付中有或没有 id_student:

    name    datepayment
    Lisa    2017-01-01
    Lisa    2017-02-03
            2017-03-05
    Lisa    2017-03-03
    Asher       NULL
    Lee         NULL
    

    查询

    SELECT s.name, p.datepayment
    FROM
    students s
    RIGHT OUTER JOIN payment p ON s.id_student = p.id_student;
    

    将给出这个结果 - 全部来自 RIGHT 餐桌付款,并且只有在餐桌付款中有 id_student 的学生姓名:

    name    datepayment
    Lisa    2017-01-01
    Lisa    2017-02-03
            2017-03-05
    Lisa    2017-03-03
    

    查询

    SELECT s.name, p.datepayment
    FROM
    students s
    INNER JOIN payment p ON s.id_student = p.id_student;
    

    将给出这个结果 - 所有在付款表中具有 id_student 的学生姓名:

    name    datepayment
    Lisa    2017-01-01
    Lisa    2017-02-03
    Lisa    2017-03-03
            2017-03-05
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-27
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2018-05-08
      • 2012-02-28
      • 1970-01-01
      相关资源
      最近更新 更多