Как выполнить поиск данных по таблицам MySQL - PullRequest
1 голос
/ 28 января 2012

Я очень новичок в MySQL и PHP. У меня есть 2 таблицы, такие как более тысячи строк.

Table "Company A" 
id | Date       | Prize_1   | Prize_2   | Prize_3 | Prize_Consolation
1  | 2011-01-13 | "car"     | "ipad2"   | "bag"   | "mouse" 
2  | 2011-02-13 | "ps3"     | "iphone4" | "mouse" | "bag"

Table "Company B" 
id | Date       | Prize_1   | Prize_2   | Prize_3 | Prize_Consolation 
1  | 2011-01-18 | "tv"      | "iphone4" | "ipod"  | "bag" 
2  | 2011-02-13 | "iphone4" | "ipad"    | "bag"   | "mouse"

Пользователь случайным образом отправит запрос на информацию об истории поиска с указанием «выигрыша», когда и какая компания была выдана.

Пример: я хотел бы выполнить поиск по обоим таблицам на предмет приза " iphone4 ", и он должен вернуть результаты примерно так:

Company   | Date       | Prize
Company A | 2011-02-13 | Prize_2
Company B | 2011-01-18 | Prize_2
Company B | 2011-02-13 | Prize_1

Total 3 prizes for "iphone4"

Какой запрос MySQL позволит выполнить этот поиск?

1 Ответ

3 голосов
/ 28 января 2012

На самом деле это должны быть не две отдельные таблицы, а одна таблица со столбцом идентификации компании.

Однако ваша ситуация может быть решена хакерским путем:

SELECT
  'Company A' AS Company,
  Date, 
  CASE 
    WHEN Prize_1 = 'iphone4' THEN 'Prize_1'    
    WHEN Prize_2 = 'iphone4' THEN 'Prize_2'
    WHEN Prize_3 = 'iphone4' THEN 'Prize_3'
    WHEN Prize_Consolation = 'iphone4' THEN 'Prize_Consolation'
    ELSE NULL
  END AS Prize
FROM `Company A`
WHERE 
  Prize_1 = 'iphone4'
  OR Prize_2 = 'iphone4'
  OR Prize_3 = 'iphone4'
  OR Prize_Consolation = 'iphone4'
/* UNION performs the same query against both tables and combine the results */
UNION
SELECT 
  'Company B' AS Company,
  Date, 
  CASE 
    WHEN Prize_1 = 'iphone4' THEN 'Prize_1'    
    WHEN Prize_2 = 'iphone4' THEN 'Prize_2'
    WHEN Prize_3 = 'iphone4' THEN 'Prize_3'
    WHEN Prize_Consolation = 'iphone4' THEN 'Prize_Consolation'
    ELSE NULL
  END AS Prize

ОТ Company B WHERE Prize_1 = 'iphone4' ИЛИ ​​Prize_2 = 'iphone4' ИЛИ ​​Prize_3 = 'iphone4' ИЛИ ​​Prize_Consolation = 'iphone4'

Более подходящий макет таблицы для этого дизайна будет выглядеть следующим образом:

Table Prizes
---------------
id INT AUTO_INCREMENT,
Date DATETIME,
Company VARCHAR(256),
Prize_Type INT,
Prize_Item VARCHAR(256)

Table Prize_Types
---------------
Prize_Type INT AUTO_INCREMENT PRIMARY KEY,
Prize_Description VARCHAR(32)

Призы

1 | 2012-01-28 08:00:00 | 'Company A' | 3 | 'some prize'
2 | 2012-01-28 08:00:00 | 'Company A' | 2 | 'ipad'
3 | 2012-01-28 08:00:00 | 'Company A' | 1 | 'junky phone'
4 | 2012-01-28 08:00:00 | 'Company b' | 4 | 'iphone4'

Prize_Types

1 | 'Prize 1'
2 | 'Prize 2'
3 | 'Prize 3'
4 | 'Consolation Prize'

Запросите это как:

SELECT
  Company,
  Date,
  Prize_Item,
  Prize_Description
FROM Prizes JOIN Prize_Types ON Prize_Types.Prize_Type = Prizes.Prize_Type
WHERE Prize_Item = 'iphone4'

Фактически, вы также можете захотеть, чтобы компании и призовые предметы были нормализованы вих собственные таблицы, такие как Prize_Types.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...