#php #mysql #sql
#php #mysql #sql
Вопрос:
У меня есть база данных, в которой есть 3 поля (страна, рецепт, ингредиент). Все они являются первичными ключами.
У меня есть веб-сайт, на котором пользователь выбирает 2 страны, и я хочу отобразить ингредиенты, которые одинаковы в двух странах.
Итак, я написал запрос:
$result = mysql_query("SELECT DISTINCT (Recipe)
FROM recipes r1,
recipes r2
WHERE r1.Country = '$temp'
^ r2.Country = '$temp2'
^ r1.Ingredient = r2.Ingredient");
Но это выдает мне сообщение об ошибке «Рецепт столбца неоднозначен». Как именно мне это исправить?
Я также хочу подсчитать все различные рецепты. Итак, я написал запрос:
$result = mysql_query("CREATE VIEW temporary(Inglist) AS (
SELECT DISTINCT (Recipe)
FROM recipes r1,
recipes r2
WHERE r1.Country = '$temp'
^ r2.Country = '$temp2'
^ r1.Ingredient = r2.Ingredient)
SELECT COUNT(*)
FROM 'temporary' ");
Я довольно новичок в написании запросов, поэтому я в замешательстве относительно того, как заставить их работать. Как именно мне это исправить? Любая помощь была бы оценена.
Ответ №1:
Попробуйте
$result = mysql_query("SELECT DISTINCT (r1.Recipe) FROM recipes r1, recipes r2 WHERE r1.Country = '$temp' ^ r2.Country = '$temp2' ^ r1.Ingredient = r2.Ingredient");
Ответ №2:
почему рецепт в perens? perens — это оператор группировки или для указания аргументов, но в данном случае они не нужны. DISTINCT — это не функция. не зная структуры вашей таблицы, я не могу вам больше помочь
Комментарии:
1. Структура таблицы состоит всего из трех столбцов (Страна, рецепт, ингредиент). Все они являются первичными ключами. Таким образом, у вас может быть несколько стран / рецептов с одинаковым названием, но ни одна страна / рецепт / ингредиент не могут быть одинаковыми.
Ответ №3:
Вы можете попробовать, как сказал Крис Томпсон, или попробовать с
$result = mysql_query("SELECT DISTINCT (r2.Recipe) FROM recipes r1, recipes r2 WHERE r1.Country = '$temp' ^ r2.Country = '$temp2' ^ r1.Ingredient = r2.Ingredient");
Но, как я понимаю, ваша таблица имеет:
- Страна
- Рецепт
- Ингредиент
А по рецепту есть по ингредиенту? И чем вы хотите показать одни и те же ингредиенты в 2 странах ИЛИ?
Ответ №4:
Было бы полезно, если бы вы предоставили пример структуры вашей базы данных. Кроме того, вы должны сначала оптимизировать свою базу данных, создав отдельные таблицы для стран, рецептов и ингредиентов. Как и сейчас, у вас будут повторяющиеся записи с той же страной и рецептом, просто чтобы перечислить все ингредиенты.
Ваши таблицы должны выглядеть следующим образом:
Таблица стран
countryId countryName
1 United States of America
2 England
Таблица рецептов
recipeId recipeName countryId dateAdded
1 Jambalaya 1 2012-10-11
2 Bangers and Mash 2 2013-11-04
Ингредиенты
ingredientId ingredientName
1 rice
2 potato
Карта рецептов и ингредиентов
riMapId recipeId ingredientId
1 1 1
2 2 2
Ингредиенты и рецепты связаны в таблице «Карта рецептов и ингредиентов». Это правильно отделяет страну от ингредиентов и позволяет вам иметь больше полей, таких как ‘dateAdded’, которые не имеют ничего общего с ингредиентами или страной. Хотя это делает инструкции select более сложными, это также делает их более эффективными и мощными.
Чтобы выбрать все ингредиенты из двух стран
ВЫБЕРИТЕ `ингредиенты`.`ingredientName` КАК 'ingredientName', `countries`.`countryName` КАК 'countryName', `рецепты`.`recipeName` КАК 'recipeName', `recipeIngredientMap`.`riMapId` КАК 'riMapId' От `ингредиенты` ЛЕВОЕ СОЕДИНЕНИЕ `recipeIngredientMap` В `recipeIngredientMap`.`ingredientId` = `ингредиенты`.`ingredientId` ЛЕВОЕ СОЕДИНЕНИЕ `recipes` На `recipes`.`RecipeID` = `recipeIngredientMap`.`RecipeID` Присоединиться `countries` В `countries`.`CountryId` = `recipes`.`CountryId` И `countries`.`CountryId` В (1,2)
Чтобы выбрать количество рецептов из одних и тех же двух стран
ВЫБЕРИТЕ COUNT(`recipeName`) КАК 'recipeCount' ИЗ `рецепты` ГДЕ `CountryId` В (1,2)
Структура mysql
-- -- База данных: `еда` -- -- -------------------------------------------------------- -- -- Структура таблицы для таблицы `страны` -- СОЗДАЙТЕ ТАБЛИЦУ `страны` ( `CountryId` int(10) беззнаковый, НЕ НУЛЕВОЙ АВТО_ИНКРЕМЕНТ, Переменная `countryName`(255) НЕ равна НУЛЮ, ПЕРВИЧНЫЙ КЛЮЧ (`CountryId`), УНИКАЛЬНЫЙ КЛЮЧ `countryName` (`Название страны`) ) ДВИЖОК= КОДИРОВКА InnoDB ПО УМОЛЧАНИЮ = utf8 AUTO_INCREMENT =3 ; -- -------------------------------------------------------- -- -- Структура таблицы для таблицы `ингредиенты` -- СОЗДАЙТЕ ТАБЛИЦУ `ингредиенты` ( `ingredientId` int(11) NOT NULL АВТО_ИНКРЕМЕНТ, Переменный параметр `ingredientName`(255) НЕ равен НУЛЮ, ПЕРВИЧНЫЙ КЛЮЧ (`ingredientId`), УНИКАЛЬНЫЙ КЛЮЧ `ingredientName` (`имя_компонЕнта`) ) ДВИЖОК= КОДИРОВКА InnoDB ПО УМОЛЧАНИЮ = utf8 AUTO_INCREMENT =5 ; -- -------------------------------------------------------- -- -- Структура таблицы для таблицы `recipeIngredientMap` -- СОЗДАЙТЕ ТАБЛИЦУ `recipeIngredientMap` ( `riMapId` int(11) NOT NULL АВТО_ИНКРЕМЕНТ, `RecipeID` int(10) без знака NOT NULL, `ingredientId` int(10) без знака NOT NULL, ПЕРВИЧНЫЙ КЛЮЧ (`riMapId`) ) ДВИЖОК= КОДИРОВКА InnoDB ПО УМОЛЧАНИЮ = utf8 AUTO_INCREMENT =4 ; -- -------------------------------------------------------- -- -- Структура таблицы для таблицы `рецепты` -- СОЗДАТЬ ТАБЛИЦУ `рецепты` ( `RecipeID` int(10) без знака NOT NULL АВТО_ИНКРЕМЕНТ, `recipeName` varchar(255) НЕ равен НУЛЮ, `CountryId` int(10) без знака NOT NULL, `dateAdded` дата НЕ равна НУЛЮ, ПЕРВИЧНЫЙ КЛЮЧ (`RecipeID`), УНИКАЛЬНЫЙ КЛЮЧ `recipeName` (`recipeName`), КЛЮЧ `CountryId` (`Идентификатор страны`) ) ДВИЖОК= КОДИРОВКА InnoDB ПО УМОЛЧАНИЮ = utf8 AUTO_INCREMENT =3 ;
Обратите внимание, что многие поля заданы как уникальные индексы. Это предотвращает дублирование информации. Я бы сделал еще один шаг вперед и добавил внешние ключи, чтобы предотвратить вставку строк, ссылающихся на элементы, которые не существуют.