0

我有一个这样的 SQL 查询。当我通过我的 php 文件执行它时,它会给出超时错误。但是当通过 php myadmin 运行相同的查询时,它会在几秒钟内给出结果。

SELECT
    cake_apartments.id,
    cake_apartments.Headline,
    cake_apartments.Description,
    cake_apartments.photoset_id,
    cake_apartments.Rental_Price,
    cake_apartments.Bedrooms,
    cake_apartments.Bathrooms
FROM
    cake_apartments,cake_neighborhoods
WHERE
    (cake_apartments.Rented = 0)
    AND
    (cake_apartments.status = 'Active')
ORDER BY
    cake_neighborhoods.Name DESC 

我知道增加超时可能会解决问题。但我不想为这个查询花费超过 30 秒的时间。

4

2 回答 2

1

问题是你没有具体说明你的两个表之间的关系。它在 phpmyadmin 中快速返回,因为 phpmyadmin 添加了一个 LIMIT 子句,允许 mysql 服务器快速停止发送行,永远不会接近超时。

您认为查询只是检索公寓未出租且处于活动状态的行,但您真正得到的是行数 * 数据库中的社区数。

像这样重写您的查询:

SELECT
    cake_apartments.id,
    cake_apartments.Headline,
    cake_apartments.Description,
    cake_apartments.photoset_id,
    cake_apartments.Rental_Price,
    cake_apartments.Bedrooms,
    cake_apartments.Bathrooms
FROM
    cake_apartments
JOIN
    cake_neighborhoods
  ON
    cake_neighborhoods.id = cake_apartments.neighborhood_id
WHERE
    (cake_apartments.Rented = 0)
    AND
    (cake_apartments.status = 'Active')
ORDER BY
    cake_neighborhoods.Name DESC

请注意,我只是猜测这两个表在 ON 子句中是如何相关的,所以如果我弄错了,你将不得不调整它。

于 2009-10-01T13:21:00.097 回答
1

如果您只想要存在匹配的行,则您的 SQL 需要包含一个 INNER JOIN。如果cake_neighborhoods.cake_apartments_id是您在cake_neighborhoods表中的外键名称,我建议将查询重写如下:

SELECT
    cake_apartments.id,
    cake_apartments.Headline,
    cake_apartments.Description,
    cake_apartments.photoset_id,
    cake_apartments.Rental_Price,
    cake_apartments.Bedrooms,
    cake_apartments.Bathrooms,
    cake_neighborhoods.Name
FROM
    cake_apartments,cake_neighborhoods
WHERE
    (cake_apartments.Rented = 0)
    AND
    (cake_apartments.status = 'Active')
    AND
    cake_neighborhoods.cake_apartments_id = cake_apartments.id
ORDER BY
    cake_neighborhoods.Name DESC
于 2009-10-01T13:43:28.200 回答