我应该在 MySQL 中使用啥连接? [关闭]

Posted

技术标签:

【中文标题】我应该在 MySQL 中使用啥连接? [关闭]【英文标题】: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 以及如何使用参数化查询。 【参考方案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

【讨论】:

以上是关于我应该在 MySQL 中使用啥连接? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

使用啥orm或不使用它[关闭]

我啥时候应该销毁令牌[关闭]

我啥时候应该使用助手? [关闭]

连接池(理论上应该是任意连接池) spring方法切入 mybatis redis等待请求 用了mysql连接的方法阻塞超过8小时导致mysql关闭连接 应用复活后用了已关闭连接而异常

我应该使用啥,UITableView 或 UICollectionView? [关闭]

我啥时候应该使用 GRUB_TIMEOUT 选项? [关闭]