Хорошо, я отправил один ответ, но Томалак совершенно справедливо указал на логический недостаток. Я попробую еще раз:
Альтернативой перечислению категорий в виде тринадцати столбцов является перечисление их в виде тринадцати строк в таблице, например:
CREATE TABLE FoodPreference (
PersonID INT NOT NULL REFERENCES People,
FoodCat VARCHAR(10) NOT NULL REFERENCES FoodCategories,
FoodChoice VARCHAR(10) NOT NULL,
PRIMARY KEY (PersonID, FoodCat)
);
INSERT INTO FoodPreference VALUES
(123, 'bread', 'white'),
(123, 'milk', 'skim'),
(123, 'cheese', 'edam'), ...
(321, 'bread', 'brown'),
(321, 'milk', 'whole'),
(321, 'cheese', 'edam'), ...
Затем вы можете использовать запрос, подобный следующему, сопоставляя любую строку из выбранного человека (p1) со строкой с таким же выбором еды от другого человека (p2) и оттуда всем остальным выборам этого человека (p3 ):
SELECT DISTINCT p3.*
FROM FoodPreference AS p1
JOIN FoodPreference AS p2
ON (p1.FoodCat = p2.FoodCat AND p1.FoodChoice = p2.FoodChoice
AND p1.PersonID != p2.PersonID)
JOIN FoodPreference AS p3
ON (p2.PersonID = p3.PersonID AND p2.FoodCat != p3.FoodCat)
WHERE p1.PersonID = {(int)$chosen_person_id}
AND p1.FoodCat IN ('milk', 'bread', 'cheese');
Список 'молоко', 'хлеб', 'сыр' в предложении WHERE - это то, что вам нужно создать в своем PHP-коде на основе переменной $_POST
в вашем приложении. Если флажок установлен, включите эту категорию продуктов питания в список.
<?php
$food_cat_array = array("'none'");
$legal_food_cats = array('milk'=>1, 'bread'=>1, 'cheese'=>1, ...);
foreach (array_intersect_key($_POST, $legal_food_cats) as $key => $checked) {
if ($checked) {
$food_cat_array[] = "'$key'";
}
}
$in_predicate = join(',', $food_cat_array);