2013-03-20 6 views
0

Я хочу сделать хранимую процедуру, но я не знаю, какой должен быть правильный подход или если это возможно сделать в MySQL.Должен ли я использовать процедуру MySQL для этого запроса?

Позвольте представить вам свою проблему. Скажем, у меня есть таблица, которая имеет столбцы, как это:

TABLE A 
id | Hotel | city_name | region_name | country 
1 | A | Amsterdam | North-Holland | Netherlands 
2 | B | Amsterdam | North-Holland | Netherlands 
3 | C | Leiden | North-Holland | Netherlands 
4 | D | Katwijk | North-Holland | Netherlands 
5 | E | Leiden | North-Holland | Netherlands 
6 | F | Katwijk | North-Holland | Netherlands 

Я хотел бы получить только 3 результаты каждый раз, когда я выполнить этот запрос, и результаты должны быть созданы в следующем порядке:

  1. Если это 3 или более городов (пользователь выбирает в этом случае мы можем взять Амстердам), который city_name=Amsterdam, а затем возвратите случайные 3 города в Амстердаме
  2. Если в Амстердаме осталось менее 3 записей, возвращайте любую запись, в которой есть Амстердам + возвратные случайные записи, где region=North-Holland, но общая сумма записей, которые повторно Оказалось всегда должно быть 3 (пример: у нас есть 2 записей, где city= Amsterdam + мы берем одну случайную запись из region=North Holand; example2: мы имеем одну запись, где city=Amsterdam + мы берем 2 случайные записи, где region="north Holland")

Возможно ли это с помощью SQL или я должен получить все записи в php, а затем перебирать каждую из записей?

Мне, вероятно, нужно пройти 2 аргумента в процедуре (city_name, region).

До сих пор я пробовал некоторые базовые SQL-запросы, и я не мог заставить его работать.

ответ

2

Вы должны попробовать что-то вроде

(SELECT * 
FROM A 
WHERE city_name = 'Amsterdam' 
ORDER BY RAND() 
LIMIT 3) 

UNION 

(SELECT * 
FROM A 
WHERE region = 'North Holand' AND city_name <> 'Amsterdam' 
ORDER BY RAND() 
LIMIT 3) 

LIMIT 3; 
+1

А, это тоже сработает, но вам нужно будет исключить город_имя «Амстердам» во втором SELECT, или вы можете получить одну и ту же запись из первого SELECT – starshine531

+1

WHERE region = 'North Holand' AND city_name < > 'Amsterdam' – Jocelyn

+0

@Jocelyn спасибо всем! –

1

Я бы порекомендовал вам сделать логическую часть этого прежде всего в PHP. Хотя это можно сделать в sql, я обнаружил, что логические структуры в sql, как правило, трудно поддаются, и это меньше относится к php.

Выполнение логики в php может потребовать два отдельных запроса (но только если вы не получите 3 изначально).

Я бы выполнил запрос, чтобы получить начальные три (используйте LIMIT 3 в sql). Проверьте, есть ли у вас три результата. Если вы этого не сделали, вычтите сумму, которую вы получаете от 3, затем используйте ее как LIMIT во втором запросе, чтобы получить другие случайные результаты.

Смежные вопросы