2010-03-22 3 views
0

У меня есть две таблицы:MYSQL - Помощь с более сложной Query

tbl_lists и tbl_houses

Внутри tbl_lists У меня есть поле, называемое HousesList - он содержит идентификаторы для нескольких домов в следующем формате:

1# 2# 4# 51# 3# 

Мне нужно уметь выбирать поля mysql из tbl_houses ГДЕ ID = любой из этих идентификаторов в списке. В частности, мне нужно SELECT SUM(tbl_houses.HouseValue) WHERE tbl_houses.ID IN tbl_lists.HousesList - и я хочу сделать это, чтобы вернуть SUM для нескольких строк в tbl_lists.

Любой может помочь? Я думаю о том, как я могу сделать это в SINGLE-запросе, так как я не хочу делать mysql loops (внутри PHP).

+0

Я в настоящее время пытается что-то вроде: tbl_lists.HousesList LIKE CONCAT ('%', tbl_houses.ID, '#') ..не работает лол ... это только выбирает первая запись в списке – Joe

+0

Хранение списков в полях, как правило, не очень хорошая идея. Можете ли вы изменить схему, или это вне вашего контроля? – Simon

+0

Я храню списки в полях, чтобы избежать необходимости в уникальных именах полей, так как мой проект очень динамичен. Не собираюсь менять это. Не беспокойтесь, я делаю это только для конкретных вещей, требующих более динамических имен полей. – Joe

ответ

0

Если ваша схема действительно фиксированы, я хотел бы сделать два запроса:

SELECT HousesList FROM tbl_lists WHERE ... (your conditions)

В PHP разделить списки и создать один массив $ houseIDs идентификаторов. Затем запустите второй запрос:

SELECT SUM(HouseValue) FROM tbl-Houses WHERE ID IN ( .join (",", $ houseIDs). )

Я до сих пор предлагают изменить схему в нечто вроде этого:

CREATE TABLE tbl_lists (listID int primary key, ...) 
CREATE TABLE tbl_lists_houses (listID int, houseID int) 
CREATE TABLE tbl_houses (houseID int primary key, ...) 

Тогда запрос становится тривиальным:

SELECT SUM(h.HouseValue) FROM tbl_houses AS h, tbl_lists AS l, tbl_lists_houses AS lh WHERE l.listID = <your value> AND lh.listID = l.listID AND lh.houseID = h.houseID

Сохранение списков в одном поле действительно мешает вам делать что-либо полезно с ними в базе данных, и вы будете перемещаться между PHP и базой данных для всего. Также (не предполагалось нарушение), «мой проект очень динамичный» может быть плохим предлогом для «у меня нет требований или дизайна».

+0

Спасибо, я посмотрю.Нет. Я считал, что для каждого списка хранится отдельная таблица, которая хранит их таким образом, однако мне понадобится сотни таблиц для хранения идентификаторов. Это не только tbl_lists_houses, но и многое другое ... tbl_lists_boats и т. Д. И т. Д., И для каждой таблицы также требуются разные имена полей. Списки были намного эффективнее, но, возможно, я что-то упустил. В любом случае, спасибо за это. – Joe

+0

BTW Мне может не понадобиться этот запрос и просто хранить SUMS отдельно, так как мне нужно как можно больше избегать множества запросов. – Joe

Смежные вопросы