|
|
|
| Здравствуйте!
Помогите разобраться с запросом!
Есть форма которая передает данные в обработчик! После этого скрипт обращается к двум таблицам и выгружает записи!
Я составил такой запрос:
include "config.php";
$where[] = "1=1";
if(!empty($_POST['objectid'])) $where[] = "objectid = ".$_POST['objectid'];
if(!empty($_POST['mkomn'])) $where[] = "mkomn = ".$_POST['mkomn'];
if(!empty($_POST['area'])) $where[] = "area like '%".$_POST['area']."%'";
if(!empty($_POST['floor'])) $where[] = "floor rlike '^".$_POST['floor']."/'";
if(!empty($_POST['sall_min'])) $where[] = "sall >= ".$_POST['sall_min'];
if(!empty($_POST['sall_max'])) $where[] = "sall <= ".$_POST['sall_max'];
if(!empty($_POST['kitchen_min'])) $where[] = "kitchen >= ".$_POST['kitchen_min'];
if(!empty($_POST['kitchen_max'])) $where[] = "kitchen <= ".$_POST['kitchen_max'];
if(!empty($_POST['price_min'])) $where[] = "price >= ".$_POST['price_min'];
if(!empty($_POST['price_max'])) $where[] = "price <= ".$_POST['price_max'];
if(!empty($_POST['metro'])) $where[] = "metro like '%".$_POST['metro']."%'";
if(!empty($_POST['phone'])) $where[] = "phone like '%".$_POST['phone']."%'";
if(!empty($_POST['house'])) $where[] = "house like '%".$_POST['house']."%'";
if(!empty($_POST['wc'])) $where[] = "wc like '%".$_POST['wc']."%'";
$query = "SELECT * FROM kvarts WHERE ".implode(" AND ",$where)." AND kvarts join db_photo on kvarts.objectid = db_photo.photoid ORDER by $sort";
|
Но ругается и говорит что проблема в синтаксисе! Подскажите можно ли вообще сделать такой запрос, и если можно то как правильно это реализовать? Заранее спасибо! | |
|
|
|
|
|
|
|
для: Front
(30.03.2007 в 12:34)
| | Части sql-запроса должны следовать в определенном порядке.
1. SELECT поля....
2. FROM таблица [JOIN таблица ON условие соединения .... ]
3. WHERE условие отбора
4. GROUP BY поля агрегирования....
5. HAVING условие отбора агрегатов
6. ORDER BY поля порядка...
Пропускать ненужные - можно. Менять местами оставшиеся - нельзя.
У Вас же часть WHERE развалилась на две, причем первая половина попала выше списка таблиц. Так нельзя. | |
|
|
|
|
|
|
|
для: Trianon
(30.03.2007 в 12:44)
| | Составил такой запрос:
$query = "select * from kvarts join db_photo on kvarts.objectid = db_photo.photoid where ".implode(" AND ",$where)." order by $sort";
|
Ошибку теперь не выдает, но почему то в результатах поиска ничего нет, переменные передаются, я проверил. В чем проблема, не пойму:
Струкрута таблиц:
kvarts:
CREATE table kvarts (objectid INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
mkomn INT(2) NOT NULL,
area TINYTEXT NOT NULL,
address TINYTEXT NOT NULL,
floor TINYTEXT NOT NULL,
sall float(4,1) NOT NULL,
slive TINYTEXT NOT NULL,
kitchen float(3,1) NOT NULL,
metro TINYTEXT NOT NULL,
phone TINYTEXT NOT NULL,
house TINYTEXT NOT NULL,
wc TINYTEXT NOT NULL,
price DECIMAL(6,3) NOT NULL,
dop TINYTEXT NOT NULL
|
db_photo:
CREATE table db_photo (photoid INT(11) not null,
photo1_os TINYTEXT NOT NULL,
photo1_b TINYTEXT NOT NULL,
photo2_os TINYTEXT NOT NULL,
photo2_b TINYTEXT NOT NULL,
photo3_os TINYTEXT NOT NULL,
photo3_b TINYTEXT NOT NULL,
photo4_os TINYTEXT NOT NULL,
photo4_b TINYTEXT NOT NULL,
photo5_os TINYTEXT NOT NULL,
photo5_b TINYTEXT NOT NULL,
key photoid (photoid)
|
У меня всего одно запись в таблице db_photo, когда выгружаешь все записи без передачи параметров, он только эту запись и показывает, а вот как сделать чтобы даже если в таблице kvarts есть objectid а в db_photo нету photoid равный по значению эта запись все равно выводилась? | |
|
|
|
|
|
|
|
для: Front
(30.03.2007 в 13:06)
| | попробуйте сделать echo $query перед выполнением, и посмотреть, что за запрос Вы получили в конечном итоге.
Чтобы проветрить на месте - структуры мало. Нужно еще кусочек дампа данных небольшой, и входные поля.
А соответствие строк в базе у Вас есть? Если у квартир нет фото, вы не получите ничего. Тут нужен LEFT JOIN, чтобы цеплять kvarts независимо от того, есть ли соотв db_photo | |
|
|
|
|
|
|
|
для: Trianon
(30.03.2007 в 13:28)
| | To Trianon: Спасибо, большое.
Да действительно, если писать просто JOIN он выводит только записи где objectid = photoid. А вот при использовании LEFT JOIN вывелись записи которым не соответствовало условие.
В итоге получился такой запрос:
$query = "select * from kvarts left join db_photo on kvarts.objectid = db_photo.photoid where ".implode(" AND ",$where)." order by $sort";
|
Еще раз огромное спасибо! Тема закрыта! | |
|
|
|