PHP和MySQL中如何使用condition连接两个表获取数据

PHP和MySQL中如何使用condition连接两个表获取数据,php,mysql,Php,Mysql,我需要一个人帮忙。我需要通过在PHP和Mysql中使用某种条件连接两个表来获取数据。这里的条件有点棘手。让我先解释一下这两个表 德布鲁餐厅: db_子目录: 我需要连接上面两个表,并使用下面给出的某些条件获取subcat\u id和subcat\u name 提示: 20公里=3公里 从上面可以清楚地看出,如果距离,那么在PHP中生成sql语句非常容易。 比如: $sql = "select r.hotel, s.id, s.name from db_subcat s left join db

我需要一个人帮忙。我需要通过在PHP和Mysql中使用某种条件连接两个表来获取数据。这里的条件有点棘手。让我先解释一下这两个表

德布鲁餐厅:

db_子目录:

我需要连接上面两个表,并使用下面给出的某些条件获取
subcat\u id和subcat\u name

提示:

<5公里=0
5-10公里=1
10-20公里=2
>20公里=3公里

从上面可以清楚地看出,如果距离,那么在PHP中生成sql语句非常容易。 比如:

$sql = "select r.hotel, s.id, s.name
from db_subcat s
left join db_restaurant r on s.id = r.subcat
where r.distance";

switch ($hint)
{
    case 1:
        $sql .= " < 5";
        break;
    case 2:
        $sql .= " between 5 and 10";
        break;
    case 3:
        $sql .= " between 10 and 20";
        break;
    case 4:
        $sql .= " < 20";
        break;
}

$res = mysql_query($sql);
$sql=“选择r.hotel、s.id、s.name
从db_子目录s
左连接s.id=r.subcat上的db_餐厅r
其中r.distance“;
开关($hint)
{
案例1:
$sql.=“<5”;
打破
案例2:
$sql.=“介于5和10之间”;
打破
案例3:
$sql.=“介于10和20之间”;
打破
案例4:
$sql.=“<20”;
打破
}
$res=mysql\u查询($sql);
或针对同一问题的纯SQL解决方案:

DROP TABLE IF EXISTS `test`.`db_restaurant`;

CREATE TABLE  `test`.`db_restaurant` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `hotel` varchar(45) NOT NULL,
  `subcat` int(10) unsigned NOT NULL,
  `distance` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into test.db_restaurant() values
(1,'Maa',10,15),
(2,'Tprutee',4,1700),
(3,'Tarini',5,10),
(4,'Tasty',10,7),
(5,'sagar',5,21),
(6,'Magar',3,18),
(7,'bagar',5,20),
(8,'duat',4,5);

DROP TABLE IF EXISTS `test`.`db_subcat`;

CREATE TABLE  `test`.`db_subcat` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into test.db_subcat values
(3,'Subcat 1'),
(4,'Subcat 2'),
(5,'Subcat 3'),
(10,'Subcat 4');

DROP TABLE IF EXISTS `test`.`db_hint`;

CREATE TABLE  `test`.`db_hint` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `data` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into test.db_hint values
(1,' < 5'),
(2,' between 5 and 10'),
(3,' between 10 and 20'),
(4,' > 20');

SELECT * FROM db_hint
where id=2;

select r.hotel, s.id, s.name
from db_subcat s
left join db_restaurant r on s.id = r.subcat
where r.distance > 20;

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`db_distance` $$
CREATE PROCEDURE `test`.`db_distance` (_hint int)
BEGIN

select data into @h from test.db_hint where id=_hint;

set @s =concat("select r.hotel, s.id, s.name
from db_subcat s
left join db_restaurant r on s.id = r.subcat
where r.distance",@h);

prepare stmt from @s;
execute stmt;
deallocate prepare stmt;

END $$

DELIMITER ;

call db_distance(2);
删除表(如果存在)`test`.`db_restaurant`);
创建表'test`.'db_restaurant`(
`id`int(10)无符号非空自动增量,
`瓦查尔酒店(45)非空,
`subcat`int(10)无符号非空,
`距离`int(10)无符号非空,
主键(`id`)
)ENGINE=MyISAM默认字符集=utf8;
插入test.db_()值
(1,'Maa',10,15),
(2,'Tprutee',41700),
(3,'Tarini',5,10),
(4,'Tasty',10,7),
(5,'sagar',5,21),
(6,'Magar',3,18),
(7,'bagar',5,20),
(8,'duat',4,5);
删除表(如果存在)`test`.`db_subcat`);
创建表“test”。“db_subcat”(
`id`int(10)无符号非空自动增量,
`name`varchar(45)不为空,
主键(`id`)
)ENGINE=MyISAM默认字符集=utf8;
插入test.db_子组值
(3,“子类别1”),
(4,“子类别2”),
(5,“子类别3”),
(10,“子类别4”);
删除表(如果存在)`test`.`db_hint`);
创建表'test`.'db_hint`(
`id`int(10)无符号非空自动增量,
`数据'varchar(255)不为空,
主键(`id`)
)ENGINE=MyISAM默认字符集=utf8;
插入test.db_提示值
(1,' < 5'),
(2,'介于5和10'之间',
(3,'介于10和20'之间',
(4,' > 20');
从db_提示中选择*
其中id=2;
选择r.hotel、s.id、s.name
从db_子目录s
左连接s.id=r.subcat上的db_餐厅r
其中r.distance>20;
分隔符$$
放置程序(如果存在)`test`.`db_distance`$$
创建过程'test`.'db\u distance`(提示int)
开始
从test.db\u hint中将数据选择到@h中,其中id=\u hint;
设置@s=concat(“选择r.hotel、s.id、s.name
从db_子目录s
左连接s.id=r.subcat上的db_餐厅r
其中r.距离“,@h);
从@s准备stmt;
执行stmt;
解除分配准备stmt;
结束$$
定界符;
呼叫距离(2);
< 5 km=0
5-10 km=1
10-20 km=2
> 20 km=3
$sql = "select r.hotel, s.id, s.name
from db_subcat s
left join db_restaurant r on s.id = r.subcat
where r.distance";

switch ($hint)
{
    case 1:
        $sql .= " < 5";
        break;
    case 2:
        $sql .= " between 5 and 10";
        break;
    case 3:
        $sql .= " between 10 and 20";
        break;
    case 4:
        $sql .= " < 20";
        break;
}

$res = mysql_query($sql);
DROP TABLE IF EXISTS `test`.`db_restaurant`;

CREATE TABLE  `test`.`db_restaurant` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `hotel` varchar(45) NOT NULL,
  `subcat` int(10) unsigned NOT NULL,
  `distance` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into test.db_restaurant() values
(1,'Maa',10,15),
(2,'Tprutee',4,1700),
(3,'Tarini',5,10),
(4,'Tasty',10,7),
(5,'sagar',5,21),
(6,'Magar',3,18),
(7,'bagar',5,20),
(8,'duat',4,5);

DROP TABLE IF EXISTS `test`.`db_subcat`;

CREATE TABLE  `test`.`db_subcat` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into test.db_subcat values
(3,'Subcat 1'),
(4,'Subcat 2'),
(5,'Subcat 3'),
(10,'Subcat 4');

DROP TABLE IF EXISTS `test`.`db_hint`;

CREATE TABLE  `test`.`db_hint` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `data` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into test.db_hint values
(1,' < 5'),
(2,' between 5 and 10'),
(3,' between 10 and 20'),
(4,' > 20');

SELECT * FROM db_hint
where id=2;

select r.hotel, s.id, s.name
from db_subcat s
left join db_restaurant r on s.id = r.subcat
where r.distance > 20;

DELIMITER $$

DROP PROCEDURE IF EXISTS `test`.`db_distance` $$
CREATE PROCEDURE `test`.`db_distance` (_hint int)
BEGIN

select data into @h from test.db_hint where id=_hint;

set @s =concat("select r.hotel, s.id, s.name
from db_subcat s
left join db_restaurant r on s.id = r.subcat
where r.distance",@h);

prepare stmt from @s;
execute stmt;
deallocate prepare stmt;

END $$

DELIMITER ;

call db_distance(2);