2013-10-17 39 views
0

嗨StackOverflow成员,试图匹配的房间

我想解决一些朋友的代码,但我没有摆脱它。我们已经迈出了一步,但并不是确切的顺序。先让我解释一下。

我们想创建一个匹配系统。但不是以用户为基础,而是以实际房间为基础。比赛是由最大租金,最小平方米和选择的城市。

现在我们创建了以下代码,它输出每个用户及其相应的房间。

$members = $db->query("Select g.gFirstname, g.gLastname,g.gEmail, v.vMeter, v.vMaxrent, v.vWhen, v.vCity From users as g LEFT JOIN users_pref as v ON(g.gId=v.vGid)"); 

$count = $members->num_rows; 

while($fetch = $members->fetch_assoc()){ 
    echo '<br /><br />'; 
    echo 'Rooms found for: <strong>'.stripslashes($fetch['gFirstname']).' '.stripslashes($fetch['gLastname']).'</strong><br /><br />'; 
    $selectKamers = $db->query("Select * From rooms Where kWhen >= ".$fetch['vWhen']." AND kCity = ".$fetch['vCity']." AND kMeter >= '".$fetch['vMeter']."' AND kMaxrent <= ".$fetch['vMaxrent'].""); 

    while($kamer = $selectKamers->fetch_assoc()){ 
     echo '<h1>'.$kamer['kStreet'].' '.$kamer['kHomenumber'].'</h1>'; 
    } 
} 

此代码为我说,首先显示所有用户,而在下面的每个用户的列,示出了每一个房间的使用者施加他的喜好相匹配。

现在的问题是。我们希望创建显示所有房间的功能,并在其下方显示与该房间相匹配的所有用户。

也许是因为缺乏洞察力,但有人可能会帮助我在路上如何尝试实现这一目标?

我的数据库表如下:

--users 
gId | gFistname | gLastname | gEmail 
1 | Bob  | Hope  | Email 
2 | John  | Doe  | Email 

--users_pref 
vGid | vMeter | vMaxrent | vWhen | vCity 
1 | 10  | 400  | time() | cityId 
2 | 20  | 500  | time() | cityId 

--rooms 
kWhen | kStreet | kHomenumber | kMeter | kMaxrent | kCity 
time() | street | 100   | 15  | 300  | cityid 
time() | street | 200   | 25  | 400  | cityid 

我想如果我错过了什么尽可能完整的与我的解释,请让我知道。

非常感谢提前!

Kevin。

+0

你看到LEFT JOIN? – Strawberry

+0

我不明白第1行的左连接与它有什么关系。我无法将users_pref更改为房间,因为表格用户和房间之间没有连接标识。 – KevinH

+0

什么是首选项表和房间表上的主键? – Strawberry

回答

0

与任何兼容的用户考虑的所有客房以下...

DROP TABLE IF EXISTS users; 

CREATE TABLE users 
(user_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY 
,firstname VARCHAR(12) NOT NULL 
,lastname VARCHAR(12) NOT NULL 
,email VARCHAR(12) NOT NULL UNIQUE 
); 

INSERT INTO users VALUES 
(1 ,'Bob','Hope','Email1'), 
(2 ,'John','Doe','Email2'); 

DROP TABLE IF EXISTS user_preferences; 

CREATE TABLE user_preferences 
(user_id INT NOT NULL 
, city_id INT NOT NULL 
, date VARCHAR(30) NOT NULL 
, meter INT NOT NULL 
, maxrent INT NOT NULL 
, PRIMARY KEY(user_id,city_id,date) 
); 

INSERT INTO user_preferences VALUES 
(1,1,'time()',10,400),  
(2,1,'time()',20,500); 

DROP TABLE IF EXISTS rooms; 

CREATE TABLE rooms 
(city_id INT NOT NULL 
,street VARCHAR(12) NOT NULL 
,homenumber INT NOT NULL 
,date VARCHAR(30) NOT NULL 
,meter INT NOT NULL 
,maxrent INT NOT NULL 
,PRIMARY KEY(city_id,street,homenumber) 
); 

INSERT INTO rooms VALUES 
(1,'street',100,'time()',15,300), 
(1,'street',200,'time()',25,400); 

获取列表一起,我们可以做到这一点...

SELECT r.*,u.* 
    FROM rooms r 
    LEFT 
    JOIN user_preferences ru 
    ON ru.city_id = r.city_id 
    AND ru.date = r.date 
    AND ru.meter <= r.meter 
    AND ru.maxrent >= r.maxrent 
    LEFT 
    JOIN users u 
    ON u.user_id = ru.user_id; 

+---------+--------+------------+--------+-------+---------+---------+-----------+----------+--------+ 
| city_id | street | homenumber | date | meter | maxrent | user_id | firstname | lastname | email | 
+---------+--------+------------+--------+-------+---------+---------+-----------+----------+--------+ 
|  1 | street |  100 | time() | 15 |  300 |  1 | Bob  | Hope  | Email1 | 
|  1 | street |  200 | time() | 25 |  400 |  1 | Bob  | Hope  | Email1 | 
|  1 | street |  200 | time() | 25 |  400 |  2 | John  | Doe  | Email2 | 
+---------+--------+------------+--------+-------+---------+---------+-----------+----------+--------+ 
+0

连接到用户数据库在此先感谢即时通讯测试它..我猜“ru”是“你”...? – KevinH

+0

好吧,非常感谢..它像魔术一样工作..使连接查询的新方法我不明白。感谢那! – KevinH