2013-09-23 2 views
1

У меня есть две таблицы в базе данных:MYSQL: Выбор записей по отношению к нескольким строкам другой таблицы

  • записи (ID, расстояние, статус [...])
  • entriesmeta (ID, entry_id, metakey, metavalue)

До сих пор я выбираю записи, как это:

SELECT ID, 
distance 
FROM entries 
WHERE status = '2' HAVING distance < 30 
ORDER BY distance 
LIMIT 20 

Теперь вторая таблица содержит Данные такого рода:

ID | entry_ID | metakey | metavalue 
1 | 137  | service | 13 
2 | 137  | service | 7 
3 | 137  | service | 76 
4 | 84  | service | 23 
etc. 

Записи в первой таблице, рестораны, услуги, во второй таблице услуг, которые они предлагают. То, что я пытаюсь на некоторое время, заключается в следующем: Создайте форму поиска в формате HTML, которая позволяет пользователям выбирать определенные службы с помощью флажков. Затем запрос MYSQL должен выбрать все записи, которые предлагают ВСЕ эти сервисы. Пока форма поиска помещает выбранные службы в массив (7,13,9,27).

Моя проблема заключается в поиске правильного запроса к базе данных. Он должен соответствовать полю metavalue с помощью checkbox-array и затем выбирать все записи из первой таблицы, которые предлагают все эти службы. Я экспериментировал с «LEFT JOIN ON entries.ID = entriesmeta.entry_ID» и несколькими предложениями WHERE, но не имел успеха. Интересно, может ли кто-то помочь.

Благодарим вас заблаговременно - и извините за мой плохой английский.

+0

можете ли вы опубликовать заявление о запросе, которое у вас есть на данный момент? – Maximus2012

+1

вы можете использовать это http://www.sqlfiddle.com/#!2/aef18/2 (примечание: SQLFiddle Demo основывается на андерсере от пользователя 491243), чтобы оптимизировать, когда вы ожидаете большого количества записей в обеих таблицах и удалить необходимость «Использовать временные, используя filesort», что действительно являются убийцами производительности для MySQL, потому что сортировка может быть выполнена на диске –

ответ

3
SELECT e.ID 
FROM entries e 
     INNER JOIN entriesmeta m 
      ON e.ID = m.entry_id 
WHERE 
     m.metakey = 'service' AND 
     m.metavalue IN (7,13,9,27) 
GROUP BY e.ID 
HAVING COUNT(DISTINCT m.metavalue) = 4 

Этот запрос будет отображать все ID, который имеет metakey из service и значение (сек) из 7, 13, 9, 27.

+0

Почему «HAVING COUNT (DISTINCT b.metavalue) = 4'? – AlexP

+0

@AlexP, если есть возможности, что 'metavalue' не является уникальным. в любом случае, если он уникален, вы можете просто удалить 'DISTINCT' и изменить его на' HAVING COUNT (*) = 4' http://www.sqlfiddle.com/#!2/f2869/2 –

+0

Мне не нужно 'DISTINCT ', так как' metavalue' уникален. В противном случае это именно то, что мне нужно. Благодаря! –

2

Это вас доставит entries, у которых есть значение entriesmeta. Это то, о чем я думаю спрашиваю.

SELECT entries.* from entriesmeta 
INNER JOIN entries on entries.ID = entriesmeta.entry_ID 
WHERE entriesmeta.metavalue = <myValue> 
Смежные вопросы