2015-07-17 4 views
-1

Я пытаюсь выбрать два (разделенных запятой) элементов, один для «кухни», а другой - для «объектов» из 4 таблиц в mysql.Как сделать этот выбор в одном запросе?

Это, как я попробовал:

$query = "SELECT GROUP_CONCAT(DISTINCT c.name SEPARATOR ', ') AS cuisines, 
       GROUP_CONCAT(DISTINCT f.name SEPARATOR ', ') AS facilities 
      FROM cuisines c, facilities f 
      INNER JOIN restaurant_cuisines rc ON rc.cuisine_id = c.id 
      INNER JOIN restaurant_facilities rf ON rf.facility_id = f.id  
      WHERE rc.restaurant_id = 16 AND rf.restaurant_id = 16"; 

Но этот запрос не работает. Но если я использую два отдельных запроса для этого двух вариантов, я могу заставить его работать. Но я ищу решение в одном запросе.

Это выход, если я использую два отдельных запроса:

mysql> SELECT GROUP_CONCAT(DISTINCT c.name SEPARATOR ', ') AS cuisines 
    -> FROM cuisines c 
    -> INNER JOIN restaurant_cuisines rc ON rc.cuisine_id = c.id 
    -> WHERE rc.restaurant_id = 15; 
+-----------------------------------------+ 
| cuisines        | 
+-----------------------------------------+ 
| American, Asian, Bars & Pubs, Beverages | 
+-----------------------------------------+ 
1 row in set (0.14 sec) 

Может кто-нибудь сказать мне, возможно ли это в MySQL?

спасибо.

+0

необходимо обновить с вы хотите (и ввести для ресторана 16 в обе таблицы) – amdixon

+0

@amdixon, обновил мой вопрос. Да 'restaurant_id' одинаково для обеих таблиц. – user3733831

+0

Ваш запрос состоит из микширования, обозначения и внутренней записи соединения. поэтому вы получаете ошибку. – xQbert

ответ

1

Не следует смешивать , и inner join обозначения в статье из них два отдельных стандартов (ANSI против не-ANSI) компилятор должен выбрать и использовать один, он не может использовать оба. другими словами ...

FROM cuisines c, <-- This isn't allowed with inner join syntax.. 
    facilities f 
INNER JOIN restaurant_cuisines rc ON rc.cuisine_id = c.id 
INNER JOIN restaurant_facilities rf ON rf.facility_id = f.id 

Я изменил порядок стыки так, что кухонь -> restraunt_Cusines -> restraunt_facilities -> центр. Я считаю, что это точно, основываясь на обозначениях и объединениях. Я также устранил один из критериев where where, поскольку теперь он избыточен на основе созданных объединений.

SELECT GROUP_CONCAT(DISTINCT c.name SEPARATOR ', ') AS cuisines, 
     GROUP_CONCAT(DISTINCT f.name SEPARATOR ', ') AS facilities 
FROM cuisines c 
INNER JOIN restaurant_cuisines rc 
    ON rc.cuisine_id = c.id 
INNER JOIN restaurant_facilities rf 
    ON rc.restraunt_Id = Rf.restraunt_ID 
INNER JOIN facilities f 
    ON rf.facility_id = f.id  
WHERE rc.restaurant_id = 16; 

или

SELECT GROUP_CONCAT(DISTINCT c.name SEPARATOR ', ') AS cuisines, 
     GROUP_CONCAT(DISTINCT f.name SEPARATOR ', ') AS facilities 
FROM cuisines c 
    ,facilities f 
    , restaurant_cuisines rc 
    , restaurant_facilities rf 
WHERE rc.restaurant_id = 16 
    AND rf.restaurant_id = 16 
    AND rc.cuisine_id = c.id 
    AND rf.facility_id = f.id  

Однако я полагаю, вы упускаете соединение между restaurant_cuisines и restaurant_facility, вероятно на restaurant_Id, которые позволили бы вам исключить из из двух rc.restaurant_id = 16 AND rf.restaurant_id = 16

1

Вы должны добавить GROUP BY заявление для того, чтобы иметь эффект:

SELECT cuisines,facilities FROM (
SELECT GROUP_CONCAT(DISTINCT c.name SEPARATOR ', ') AS cuisines, restaurant_id 
     FROM cuisines c 
     INNER JOIN restaurant_cuisines rc ON rc.cuisine_id = c.id 
     WHERE rc.restaurant_id = 16) a 
INNER JOIN (
SELECT GROUP_CONCAT(DISTINCT f.name SEPARATOR ', ') AS facilities,restaurant_id 
     FROM facilities f 
     INNER JOIN restaurant_facilities rf ON rf.facility_id = f.id  
     WHERE rf.restaurant_id = 16 
     GROUP BY rf.restaurant_id) b ON a.restaurant_id=b.restaurant_id; 
+0

ОШИБКА 1054 (42S22): Неизвестная колонна 'объекты' в 'списке полей' – user3733831

+0

извините, не закончил запрос. См. Править в течение 1 минуты –

+0

ОШИБКА 1054 (42S22): Неизвестный столбец 'c.name' в 'списке полей' – user3733831