【问题标题】:SQL SELECT query not working - unable to find error [closed]SQL SELECT 查询不起作用 - 找不到错误 [关闭]
【发布时间】:2015-07-26 23:44:14
【问题描述】:

下面的select查询是从多个表tbl_bookstbl_authortbl_books_subject中搜索关键字“法律”

SELECT *
FROM tbl_books p, tbl_books_author d, tbl_books_subject m
WHERE p.title = 'law'
   OR d.author = 'law'
   OR m.subject = 'law'
LIMIT 0,30

此查询出错。请帮帮我。

【问题讨论】:

  • 错误是什么?
  • 表之间没有连接,所以你最终得到一个CROSS JOIN。该错误可能表明“空间不足”:-)
  • 错误是内部服务器错误。
  • 为您正在查看的表和预期结果提供 DDL。这个问题很不清楚。
  • 内部服务器错误听起来更像是你的 php 脚本坏了,而不是查询。 (嗯,查询结果可能是坏了,但不会导致503s,php错误会)

标签: php mysql sql select


【解决方案1】:

您需要三个单独的 SELECT(可能还有通配符搜索):

SELECT *
FROM tbl_books
WHERE title LIKE '%law%'
LIMIT 0,30

SELECT *
FROM tbl_books_author 
WHERE title LIKE '%law%'
LIMIT 0,30

SELECT *
FROM tbl_books_subject
WHERE title LIKE '%law%'
LIMIT 0,30

如果您返回兼容的结果,您可以将它们联合起来:

SELECT 'book   ', title
FROM tbl_books
WHERE title LIKE '%law%'

UNION ALL

SELECT 'author ', author
FROM tbl_books_author 
WHERE title LIKE '%law%'

UNION ALL

SELECT 'subject', subject
FROM tbl_books_subject
WHERE title LIKE '%law%'
LIMIT 0,30

【讨论】:

  • LIMIT 0,30 适用于整个查询,还是仅适用于此处的最后一个选择?
  • 如果我使用 OR 并使用 LIKE 关键字一起写会有问题。
  • 当我在顶部运行我之前的代码时,它显示“显示第 0 - 29 行(总共 1759260 行,查询耗时 5.1206 秒)”。你能解释一下为什么会这样吗?
  • 如果“previous code”表示所有“一个查询中的三个表,没有连接”,这表明您通过交叉连接表创建了一个巨大的愚蠢结果集。
【解决方案2】:

您可以在单个查询中实现这一点,但您需要在其他表中有一些外键。在这里检查下面的代码。

SELECT b.*, ba.*, bs.* FROM tbl_books as b
    FULL OUTER JOIN tbl_books_author as ba ON ba.book_id=b.id
    FULL OUTER JOIN tbl_books_subject as bs ON bs.book_id=b.id
WHERE b.title LIKE 'law' OR ba.author LIKE 'law' OR bs.subject LIKE 'law' LIMIT 0, 30;

深入查看查询,您会发现我已使用 tbl_books.id 进行连接,这些连接应该在其他表中以识别特定记录。

希望这对您有所帮助。

【讨论】:

  • 要获得其中任何列包含“法律”的结果,您需要改用FULL OUTER JOINs
  • 好的兄弟,我会改变它。谢谢你的建议。
  • @dnoeth mysql 不支持full outer join。现在这个“正确”的答案被严重破坏了。
  • @pala_:所以又回到了“三个单独的选择”:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多