【问题标题】:MYSQL JOIN TWO TABLES (+ LIMIT based on first table)MYSQL 加入两个表(+ LIMIT 基于第一个表)
【发布时间】:2023-03-15 18:36:01
【问题描述】:

我有两张这样的桌子:-

Table: offers  
|-------------- |
| id | OfferNum |
| 1  | a1       |
| 2  | a2       |
| 3  | a3       |
| 4  | a4       |
| 5  | a5       |
| 6  | a6       |
|---------------|

Table: colours 
|------------------------------------------|
| id | OfferNum  | colour    | availaility |
| 1  | a1        |blue       |yes          |
| 2  | a1        |red        |no           |
| 3  | a2        |green      |yes          |
| 4  | a3        |white      |yes          |
| 5  | a3        |brown      |yes          |
| 6  | a3        |navy       |no           |
| 7  | a3        |black      |yes          |
| 8  | a3        |red        |yes          |
| 9  | a4        |yellow     |no           |
| 10 | a5        |black      |yes          |
| 11 | a6        |white      |yes          |
|------------------------------------------|

出于分页的目的,我需要从表“offers”中选择 3 个 OfferNum,从偏移量 0 开始,然后连接两个表,以便结果行包含 3 个 offernum(即 a1、a2 和 a3)。等等……

LIMIT 0,3 的以下脚本不会产生所需的结果。

SELECT offers.OfferNum, items.colour, items.availability
FROM offers
    JOIN items ON items.OfferNum = offers.OfferNum
ORDER BY offers.id ASC 
LIMIT 0 , 3

它只产生连接表的前 3 行。像这样:-

|----------------------------|
|OfferNum|colour|availability|
|a1      |blue  |yes         |
|a1      |red   |no          |
|a2      |green |yes         |
|----------------------------|

有没有办法达到预期的效果?

【问题讨论】:

  • 那么第一页将包含 2+1+5 行?
  • 发布您的表格架构
  • @Quest SELECT * FROM offers,colours WHERE offer.OfferNum = colours.OfferNum 和 colours.OfferNum IN(从 OfferNum asc limit 0,3 的报价订单中选择 OfferNum) - 这一次让我知道它是否有效
  • Salman A:是的,它总共包含 8 行
  • Ripa Saha:它会产生此错误:- 检查与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在 'select OfferNum from offer order by OfferNum asc limit 0,3) LI

标签: mysql join limit


【解决方案1】:

如果我理解正确,您想显示报价表中的 3 个报价并在旁边显示第二个表中的所有等效值,那么您可以考虑选择您想要作为基础的数据,例如:

SELECT OfferNum
    FROM offers
ORDER BY id ASC 
    LIMIT 0 , 3

然后从中选择并使用您需要的 JOIN 类型加入它 查询如下所示:

SELECT customOffers.OfferNum, items.colour, items.availability
FROM 
(SELECT OfferNum
    FROM offers
ORDER BY id ASC 
    LIMIT 0 , 3) as customOffers
    JOIN items ON items.OfferNum = offers.OfferNum

【讨论】:

  • 我需要检索已连接的表格行,以通过 PHP 处理它们。上面的第二个脚本产生了这个错误:你的 SQL 语法有错误。检查与您的 MySQL 服务器版本相对应的手册,以了解在 'SELECT OfferNum FROM offer ORDER BY id ASC LIMIT 0 附近使用的正确语法
  • 在写这个答案之前,我已经用不同的表名和列名执行了相同的查询,它没有触发任何错误,因为我认为你的服务器似乎以不同的方式识别逗号,因为您的错误缺少逗号后面的部分,即 3,我认为首先您必须检查在区域设置中设置了哪种分隔符,第二个想法是您可能有特定的表和列名选择语法例如,如果您使用phpmyadmin,那么您需要SELECT `OfferNum` FROM `offers` ORDER BY `id` ASC LIMIT 0 , 3
  • 正常的 SELECT 语句包括 LIMIT 0,3 并且没有重音 (`)。这个问题很可能与版本有关。我将安装 MYSQL 5 并查看。稍后会更新。
  • 您能先检查一下您的区域设置吗?什么符号被指定为分隔符?为了解释如何检查它,我需要知道你运行服务器的操作系统是什么。
  • phpMyAdmin 2.6.1 + MySQL 4.0.23-nt 在 Windows xp 上。老,我知道,但到目前为止他们已经完成了这项工作。只有这个子查询不起作用!
【解决方案2】:

在子查询中移动 LIMIT 子句并加入:

SELECT offers2.OfferNum, items.colour, items.availability
FROM (SELECT * FROM offers ORDER BY id LIMIT 0, 3) AS offers2
JOIN items ON items.OfferNum = offers2.OfferNum
ORDER BY ...

【讨论】:

  • 这会产生错误:- #1064 - 您的 SQL 语法有错误。查看与您的 MySQL 服务器版本相对应的手册,了解在 'SELECT * FROM offer ORDER BY id LIMIT 0, 3) AS offer2 JOIN i 附近使用的正确语法
  • 这里没有语法错误:dbfiddle.uk/…
  • 在我的生产机器上,我使用旧的 MYSQL 版本(4.0.23-nt)。这会是个问题吗?
  • 有没有办法检查 MYSQL 版本 4 是否可以进行表别名查询?我只是在学习——不是专家。谢谢!
  • 这不使用任何花哨的语法。 MySQL 4 太老了,他们甚至不维护它的文档,抱歉。
【解决方案3】:

问题出在 MYSQL 4.0 上。

Mysql 4.1 以下版本不支持子查询 subselect sql query doesn't work on mysql 4

更多详情:http://dev.mysql.com/doc/refman/4.1/en/subqueries.html

为了快速解决问题,我安装了 MYSQL 4.1,并且来自 Irakli Gigiberia 和 Salman A 的响应均有效。

非常感谢您的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    • 2012-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多