запрос php mysql на основе множественного выбора пользователя

#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");

Но, как я понимаю, ваша таблица имеет:

  1. Страна
  2. Рецепт
  3. Ингредиент

А по рецепту есть по ингредиенту? И чем вы хотите показать одни и те же ингредиенты в 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 ;

Обратите внимание, что многие поля заданы как уникальные индексы. Это предотвращает дублирование информации. Я бы сделал еще один шаг вперед и добавил внешние ключи, чтобы предотвратить вставку строк, ссылающихся на элементы, которые не существуют.