【问题标题】:SQL - Should I use a join?SQL - 我应该使用联接吗?
【发布时间】:2012-02-10 19:09:48
【问题描述】:

我有以下示例查询(MySQL):

SELECT * FROM `action` 
WHERE `customer_id` IN 
    (SELECT `id` FROM `customer` WHERE `status`=1)
ORDER BY
    action.date ASC
LIMIT 0, 10

我需要能够按 customer.status 字段订购。我是否通过加入来完成此操作?

statuscustomer 表中的一个字段。


已编辑查询:

SELECT * FROM `action` 
ORDER BY
    action.date ASC
LIMIT 0, 10

重要!

我正在通过 PHP 解析返回数据。运行修改后的查询后:

SELECT * FROM `action` a INNER JOIN `customer` c ON a.customer_id = c.id ORDER BY a.form_id ASC LIMIT 0, 10

我的 PHP 代码中断了...


This post 帮了我一把。

我修改后的查询如下所示:

SELECT 
    *, a.id AS lead_id, c.id AS customer_id 
FROM 
    `action` a 
INNER JOIN 
    `customer` c ON a.customer_id = c.id 
ORDER BY c.status DESC

谢谢大家!


更新

因为我有一些没有操作记录的客户记录,所以 INNER JOIN 没有返回所有相关记录。我现在使用 JOIN,所有结果都按预期返回。

【问题讨论】:

  • 这是一个状态过滤器,所以我需要编辑示例

标签: mysql sql join


【解决方案1】:
SELECT * 
FROM `action` a
INNER JOIN `customer` c on a.`customer_id` = c.`id`
WHERE c.`status` in (1, 4, 7, 8)
ORDER BY a.date, c.status
LIMIT 0, 10 

【讨论】:

  • 两者都击败了我,哈哈。这将是 AVP 的方式,尽管从你的问题的声音来看,你想先按 c.status 订购
  • 我不是 mySql 专家,但我很好奇 ORDER BY 子句中的 c.status 是否有原因。
  • 如果你只想要action表的结果,你可以选择a.*,你可以在查询末尾添加一个GROUP BY a.id
  • 好点 Mike,你的 where 子句只定义了一个状态会在结果中,所以不需要按它排序
  • @WillBuck - 虽然我猜如果你错过了它,你的答案会被否决。
【解决方案2】:

您可以:

SELECT * FROM `action` a
INNER JOIN `customer` c on c.id = a.customer_id
WHERE c.status = 1
ORDER BY a.date ASC, c.status
LIMIT 0, 10

或者:

SELECT * FROM `action` a
INNER JOIN `customer` c on (c.id = a.customer_id and c.status = 1)
ORDER BY a.date ASC, c.status
LIMIT 0, 10

编辑:

可能值得指出的是,按c.status 订购是没有意义的,因为它始终是1。但是,我把它放在那里,因为它是由其他人提出的以及在 OP 中提到的。我认为它可以从两个查询中删除。

【讨论】:

  • 您忘记了按客户状态添加的订单
  • @Paul - 在那个查询中状态不是总是 1 吗?
【解决方案3】:

是的,您可以通过加入来完成它,并且可能更快:

SELECT * FROM `action` a join customer c on c.id=a.customer_id
where c.status=1
ORDER BY
    a.date ASC
LIMIT 0, 10

另外,考虑不要使用*,而是列出您需要的列。如果您需要选择的列少于所有列,它将提高性能,并且如果表发生变化,您将来也不会感到意外。

【讨论】:

  • 您忘记了按客户状态添加的订单
  • 至@MikeChristensen 的观点,但您保证查询的 where 子句中的状态始终为 1,这使得对其进行排序没有必要......
【解决方案4】:
SELECT * FROM `action` a 
JOIN `customer` c on a.customer_id=c.id 
WHERE c.status=1 order by a.date, c.status ASC 
LIMIT 0, 10

【讨论】:

    猜你喜欢
    • 2011-10-30
    • 1970-01-01
    • 2022-01-06
    • 2011-08-21
    • 1970-01-01
    • 2018-09-10
    • 2010-09-10
    • 2015-08-03
    • 1970-01-01
    相关资源
    最近更新 更多