【问题标题】:Get the last 10 rows with order ascending [closed]以升序获取最后 10 行 [关闭]
【发布时间】:2013-01-28 23:16:45
【问题描述】:

我已经尝试使用标准选择查询的所有现有尝试,方法是嵌套在另一个 SELECT 中,然后使用 ASC,但由于某种原因它无法在我的 JSCharts 中加载。我的代码工作正常,减去顺序:

SELECT `$tableName`.`$patient_idField` , `$tableDataName`.`$patient_idField` , `$tableDataName`.`$resultField` , `$tableName`.`$login_idField`
FROM `$tableName`
JOIN `$tableDataName` ON `$tableName`.`$patient_idField` = `$tableDataName`.`$patient_idField`
COLLATE utf8_general_ci
WHERE `$tableName`.`$login_idField` = $usssName
ORDER BY `$tableDataName`.id DESC LIMIT 10

这是重新排序的尝试,但加载失败:

SELECT * FROM (
SELECT `$tableName`.`$patient_idField` , `$tableDataName`.`$patient_idField` , `$tableDataName`.`$resultField` , `$tableName`.`$login_idField`
FROM `$tableName`
JOIN `$tableDataName` ON `$tableName`.`$patient_idField` = `$tableDataName`.`$patient_idField`
COLLATE utf8_general_ci
WHERE `$tableName`.`$login_idField` = $usssName
ORDER BY `$tableDataName`.id DESC LIMIT 10 ) AS `$tableName` JOIN `$tableDataName` ORDER by `$tableDataName`.id ASC

在没有 PHP 的情况下更新...

SELECT userlist.patient_id, results.patient_id, results.result, userlist.login_id
FROM userlist
JOIN results ON userlist.patient_id = results.patient_id
COLLATE utf8_general_ci
WHERE userlist.login_id = ####
ORDER BY results.id DESC
LIMIT 10 

现在,如果我对 ASC 执行此操作之外的任何操作,它会在 patient_id 的重复项上返回错误。

有效的代码,供以后参考

SELECT  *
FROM (
SELECT userlist.patient_id, results.result, userlist.login_id, results.id
FROM userlist
  JOIN results ON userlist.patient_id = results.patient_id
COLLATE utf8_general_ci
WHERE userlist.login_id = ####
ORDER BY results.id DESC
LIMIT 10 ) temp
ORDER BY id

它涉及删除 SELECT 上的 .patient_id 之一。

【问题讨论】:

  • 用一个完整的句子解释你想要做什么?标题不够清楚
  • 在 php.ini 中执行。 JOINs 必须死! (会更快)
  • 但由于某种原因无法在我的 JSCharts 中加载 - 当您直接在 MySQL 中运行失败的查询时会发生什么?最好先让您的查询独立工作,然后再将其插入其他事物中。
  • 我怀疑子选择出现重复列名错误(假设返回了两个 $patient_idField 列)
  • 我认为接受帮助然后删除问题是不公平的。仅当您对编辑问题和答案感到满意时,才能查看有关使用本网站的常见问题解答。不要担心奇怪的反对票 - 它们几乎发生在每个人身上,而且得到帮助很重要。

标签: php mysql sql mysqli


【解决方案1】:

嵌套在另一个选择中应该可以;它是怎么失败的?

类似:

select tablenamepatientidfield, tabledatanamepatientidfield, resultfield, loginidfield from (
    SELECT
        `$tableDataName`.id,
        `$tableName`.`$patient_idField` AS tablenamepatientidfield,
        `$tableDataName`.`$patient_idField` AS tabledatanamepatientidfield,
        `$tableDataName`.`$resultField` AS resultfield,
        `$tableName`.`$login_idField` AS loginidfield,
    FROM `$tableName`
    JOIN `$tableDataName` ON `$tableName`.`$patient_idField` = `$tableDataName`.`$patient_idField`
    COLLATE utf8_general_ci
    WHERE `$tableName`.`$login_idField` = $usssName
    ORDER BY `$tableDataName`.id DESC LIMIT 10
) AS descending_select ORDER BY id;

(列名都是可变的并且可能发生冲突(并且不包括 id 本身),这有点尴尬。)

【讨论】:

  • @Shane - 那么你需要进行一些调试。这会在您的 MySQL 控制台上运行吗?试试看。
  • err,这就是为什么我为它们使用了两个不同的 AS 别名
  • @Shane - 怀疑 ysth 得到了社区的支持,这在这个网站上很常见。答案当然看起来是对的......
  • 好吧,我只能说您报告的问题与我的解决方案有关,所以我怀疑您没有完全按照我的建议进行尝试。不过,我当然可能有错误或拼写错误导致其他错误。
  • 我没有兴趣讨论这个;我希望你能回应我所说的话。
【解决方案2】:

你能做到吗

select * from (
    SELECT `$tableName`.`$patient_idField` 
         , `$tableDataName`.`$patient_idField` 
         , `$tableDataName`.`$resultField` 
         , `$tableName`.`$login_idField`
         ,`$tableDataName`.id
    FROM `$tableName`
      JOIN `$tableDataName` ON `$tableName`.`$patient_idField` 
                             = `$tableDataName`.`$patient_idField`
    COLLATE utf8_general_ci
    WHERE `$tableName`.`$login_idField` = $usssName
    ORDER BY `$tableDataName`.id DESC LIMIT 10 ) t
order by id

试试这个,我已经编辑以更好地反映你实际在做什么

select  *
from (
    SELECT userlist.patient_id, results.result, userlist.login_id
    FROM userlist
      JOIN results ON userlist.patient_id = results.patient_id
    COLLATE utf8_general_ci
    WHERE userlist.login_id = ####
    ORDER BY results.id DESC
    LIMIT 10 ) temp
order by patient_id

【讨论】:

  • 有趣的是,我可以让它在分析仪中运行而没有任何问题。你能告诉我错误信息吗?
  • 您输出 ID 两次(userlist.patient_id,results.patient_id)是相同的,因为您正在加入它们,所以您只需要输出或至少为第二个(userlist. patient_id, results.patient_id 作为 secondIdOutput)
  • 在我上面的回答中查看第二个查询
  • 这是第一个工作答案,据我所知,其他人的更新并没有改善这个答案。所以这是“出于历史目的”的正确答案哈哈。现在,如果我能与 Lance 这样的人打交道,这将使 Stackoverflow 能够按照设计的方式工作。不幸的是,我遇到了那些(ysth 和 halfer)想写关于如何使用 stackoverflow 并自称是如何工作以及我应该选择谁作为答案的专家。
  • @Shane 抱歉,这篇文章变得很痛苦。我同意有时“社区”会失控。如果您不喜欢帖子,请忽略它,对。话虽如此,很高兴我能提供帮助
猜你喜欢
  • 1970-01-01
  • 2017-10-29
  • 2018-06-29
  • 1970-01-01
  • 1970-01-01
  • 2021-03-08
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多