PHP / MySQL код поиска и логика для схемы реляционной базы данных - PullRequest
1 голос
/ 23 июня 2011

Я создал эту схему базы данных, и с помощью нескольких пользователей здесь у меня есть база данных, которая берет отправленные пользователем бизнес-записи, хранящиеся в бизнес-таблице, которые дополнительно сгруппированы в одну или несколько из приблизительно 10 категорий из таблицы catagories. в таблице tbl_works_catagories, сопоставив идентификатор bus_id с идентификатором категории.

Например, bus_id 21 может быть связан с catagory_id 1, 2, 5, 7, 8.

CREATE TABLE `business` (
`bus_id` INT NOT NULL AUTO_INCREMENT, 
`bus_name` VARCHAR(50) NOT NULL, 
`bus_dscpn` TEXT NOT NULL, 
`bus_url` VARCHAR(255) NOT NULL,
PRIMARY KEY (`bus_id`)
)

CREATE TABLE `categories` (
`category_id` INT NOT NULL AUTO_INCREMENT, 
`category_name` VARCHAR(20) NOT NULL, 
PRIMARY KEY (`category_id`)
)

CREATE TABLE `tbl_works_categories` (
`bus_id` INT NOT NULL, 
`category_id` INT NOT NULL
)

Теперь, что я хочу сделать дальше, это функция поиска, которая будет возвращать предприятия на основе категории. Например, скажем, одно из предприятий, введенных в бизнес-таблицу, является пекарем, и когда оно было введено, оно было разделено на категории Еда (catagory_id 1) и Еда на вынос (catagory_id 2).

Таким образом, посетитель ищет предприятия, перечисленные в категории продуктов питания, и возвращается нашему дружелюбному пекарю.

Как и во всех PHP / MySQL, я просто не могу (во всяком случае, изначально) разобраться с логикой, не говоря уже о коде!

Ответы [ 3 ]

0 голосов
/ 23 июня 2011

Вам следует настроить внешние ключи в своих таблицах, чтобы связать их вместе.

CREATE TABLE `business` (
`bus_id` INT NOT NULL AUTO_INCREMENT, 
`bus_name` VARCHAR(50) NOT NULL, 
`bus_dscpn` TEXT NOT NULL, 
`bus_url` VARCHAR(255) NOT NULL,
PRIMARY KEY (`bus_id`)
)

CREATE TABLE `categories` (
`category_id` INT NOT NULL AUTO_INCREMENT, 
`category_name` VARCHAR(20) NOT NULL, 
PRIMARY KEY (`category_id`)
)

CREATE TABLE `tbl_works_categories` (
`bus_id` INT NOT NULL, 
`category_id` INT NOT NULL,
FOREIGN KEY (`bus_id`) REFERENCES business(`bus_id`),
FOREIGN KEY (`category_id`) REFERENCES categories(`category_id`)
)

Тогда ваш поисковый запрос будет выглядеть примерно так:

SELECT b.*
FROM business b, categories c, tbl_works_categories t
WHERE 
   b.bus_id = t.bus_id AND
   c.category_id = t.category_id AND
   c.category_id = *SOME SEARCH VALUE*

который с помощью JOIN будет записан как:

SELECT b.*
FROM business b
  JOIN tbl_works_categories t
    ON b.bus_id = t.bus_id
  JOIN categories c
    ON c.category_id = t.category_id
WHERE c.category_id = *SOME SEARCH VALUE*
0 голосов
/ 23 июня 2011

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

SELECT `business`.`bus_name`
FROM `business`
WHERE `business`.`bus_id` = `tbl_works_categories`.`bus_id`
  AND `categories`.`category_id` = `tbl_works_categories`.`category_id`
  AND `categories`.`category_id` = 1;

Где 1 в данном случае - ваша продовольственная категория,но это может быть ваша PHP-переменная, в которой хранится идентификатор категории, выбранной пользователем.

И один совет: обязательно назовите ваши таблицы либо в плюраре, либо в единственном числе.Вы смешиваете оба и можете запутаться.

0 голосов
/ 23 июня 2011

Может быть, вы хотите что-то вроде этого:

SELECT `bus_id` FROM `tbl_works_categories` WHERE `category_id` = *some id from the search* 
        AND `category_id` = *some other id from the search*;

Хотя вам понадобятся эти идентификаторы - есть несколько способов сделать это, я опишу, вероятно, самый прямой ...

Вы получаете категории из $ _POST, так что давайте просто скажем, что у вас есть 2 из них.(Еда и еда на вынос).Проанализируйте их, как хотите, есть несколько способов, но дело в том, что они исходят из $ _POST.

Выполните такую ​​вещь для каждого найденного:

SELECT `category_id` FROM `categories` WHERE `category_name` LIKE '%*the name from $_POST*%';

Storeэти результаты в массиве ... на основе того, сколько у вас там, вы можете построить соответствующий запрос, аналогичный тому, который я описал первым.(Имейте в виду, что вам это не нужно, и AND, это то, что вы должны обнаружить, если вы вернете> 1 category_id из второго запроса здесь)

Я не буду обсуждать такие вещи, как безопасность ...будьте осторожны при выполнении запросов, содержащих данные, отправленные пользователем.

Альтернативное решение может включать соединение, не слишком уверенное, как это будет выглядеть у меня в голове.

Удачи.

...