我对MySQL还不太熟悉,我想知道是否可以直接使用这些表和查询:
图阿努西奥

CREATE TABLE `tb_anuncio` (
  `anuncio_id` int(11) NOT NULL auto_increment,
  `anuncio_titulo` varchar(120) NOT NULL,
  `anuncio_valor` decimal(10,2) NOT NULL,
  `anuncio_valorTipo` int(11) default NULL,
  `anuncio_telefone` varchar(20) NOT NULL,
  `anuncio_descricao` text,
  `anuncio_criado` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `bairro_id` int(11) NOT NULL,
  `anuncio_status` int(11) default '0',
  PRIMARY KEY  (`anuncio_id`),
  KEY `ta001_ix` (`bairro_id`)
) ENGINE=InnoDB  DEFAULT charset utf8;

ALTER TABLE `tb_anuncio`
  ADD CONSTRAINT `ta001_ix` FOREIGN KEY (`bairro_id`) REFERENCES `tb_bairro` (`bairro_id`) ON DELETE CASCADE ON UPDATE CASCADE;

埃斯塔多
CREATE TABLE `tb_estado` (
  `estado_id` int(11) NOT NULL auto_increment,
  `estado_nome` varchar(2) NOT NULL,
  `estado_criado` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `estado_url` varchar(2) NOT NULL,
  PRIMARY KEY  (`estado_id`),
  UNIQUE KEY `estado_url` (`estado_url`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

结核病防治
CREATE TABLE `tb_cidade` (
  `cidade_id` int(11) NOT NULL auto_increment,
  `cidade_nome` varchar(100) NOT NULL,
  `cidade_criado` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `estado_id` int(11) NOT NULL,
  `cidade_url` varchar(150) NOT NULL,
  PRIMARY KEY  (`cidade_id`),
  UNIQUE KEY `cidade_url` (`cidade_url`),
  KEY `tc001_ix` (`estado_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

ALTER TABLE `tb_cidade`
  ADD CONSTRAINT `tc001_ix` FOREIGN KEY (`estado_id`) REFERENCES `tb_estado` (`estado_id`) ON DELETE CASCADE ON UPDATE CASCADE;

白罗结核病
CREATE TABLE `tb_bairro` (
  `bairro_id` int(11) NOT NULL auto_increment,
  `bairro_nome` varchar(100) NOT NULL,
  `bairro_criado` timestamp NOT NULL default CURRENT_TIMESTAMP,
  `cidade_id` int(11) NOT NULL,
  `bairro_url` varchar(150) NOT NULL,
  PRIMARY KEY  (`bairro_id`),
  UNIQUE KEY `bairro_url` (`bairro_url`),
  KEY `tb001_ix` (`cidade_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

ALTER TABLE `tb_bairro`
  ADD CONSTRAINT `tb001_ix` FOREIGN KEY (`cidade_id`) REFERENCES `tb_cidade` (`cidade_id`) ON DELETE CASCADE ON UPDATE CASCADE;

我正在做一个查询,显示一个城市/州的广告,我的查询看起来像:
查询
select a.anuncio_id,a.anuncio_titulo,a.anuncio_valor,a.anuncio_valorTipo,a.anuncio_descricao
from tb_anuncio a inner join(
tb_bairro b inner join(
tb_cidade c inner join
tb_estado d on d.estado_id=c.estado_id) on c.cidade_id=b.cidade_id) on b.bairro_id=a.bairro_id
where a.anuncio_status=1 and d.estado_id=:estado_id and c.cidade_id=:cidade_id and b.bairro_id=:bairro_id
group by a.anuncio_id
order by a.anuncio_id desc
limit :limit

我想知道我是不是走对了,当这些表得到大约5-10公里的记录时,它会很好地工作。
我正在使用PHP PDO MySQL。
谢谢。

最佳答案

尽管它不会影响性能,但是编写查询的典型方法在FROM子句中不会有括号。另外,我怀疑group by是否必要:

select a.*
from tb_anuncio a inner join
     tb_bairro b
     on b.bairro_id = a.bairro_id inner join
     tb_cidade c
     on c.cidade_id = b.cidade_id inner join
     tb_estado e
     on e.estado_id = c.estado_id
where a.anuncio_status = 1 and e.estado_id = :estado_id and
      c.cidade_id = :cidade_id and b.bairro_id = :bairro_id
order by a.anuncio_id desc
limit :limit;

您可以简化这一点,因为您不需要所有的joins--join键都在引用表中:
select a.*
from tb_anuncio a inner join
     tb_bairro b
     on b.bairro_id = a.bairro_id inner join
     tb_cidade c
     on c.cidade_id = b.cidade_id
where a.anuncio_status = 1 and c.estado_id = :estado_id and
      c.cidade_id = :cidade_id and b.bairro_id = :bairro_id
order by a.anuncio_id desc
limit :limit;

关于php - 具有大数据性能的MySQL查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45450060/

10-09 16:08
查看更多