2015-03-01 3 views
2

Я пытаюсь выбрать из 3 таблиц: продуктов, предложений, заказов.MYSQL выбор из 3 таблиц

В заявках, это просто предложение идентификатор, имя пользователя, сумма, отметка времени, дата, пункт

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

в заказывает его адреса, имя пользователя, имена, продукт, отправлено

Я пытаюсь выбрать все строки из всех тех таблиц, где имя пользователя =? поэтому я могу проверить, был ли товар отправлен через $ query-> отправленный (таблица заказов) или оплаченный $ query-> статус (таблица заказов) вместо того, чтобы делать foreach и другой запрос

Теперь у меня был запрос, который был работать на 2 из этих таблиц, но когда я addeed заказов, никаких продуктов, где не показаны:

Работа

SELECT * FROM bids,products WHERE bids.username=? AND NOW() > products.enddate GROUP BY item ORDER BY amount DESC 

не работаю, но нужны этот тип запроса

SELECT * FROM bids,products,orders WHERE bids.username=? AND NOW() > products.enddate GROUP BY item ORDER BY amount DESC 

Как я могу выбрать порядок заказов. Я приложил структуру таблиц для справки .:

продукты - нужны все

products

Заказы - Потребность товара все

orders

- Нужна все

bids

ответ

1

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

Я вижу, что ваш стол Bids имеет столбец item. Если этот столбец, как мне кажется, будет таким, имя столбца должно быть чем-то вроде product_id, и оно должно быть указано как ссылка внешнего ключа на столбец id вашей таблицы Products. Таким образом, мы можем убедиться, что каждая ставка предназначена для действительного продукта.

Учитывая, что item столбец Bids является внешним ключом к Products, ваш первый запрос будет правильно указано (с точки зрения ссылочной целостности и мощности), как:

SELECT * FROM bids INNER JOIN products ON bids.item = products.id 
WHERE bids.username=? AND NOW() > products.enddate 
ORDER BY amount DESC 

Если вы хотите, чтобы убедиться, что вы извлекайте все записи о товарах независимо от того, имеют ли они ставки, затем используйте RIGHT JOIN выше, а не INNER JOIN, и измените свое имя пользователя на (bids.username = ? OR bids.username IS NULL).

Теперь для вашего второго запроса, который вы просите о помощи. Учитывая предоставленную вами схему, нет хорошего способа представить такой запрос. Я боюсь, что запрос никогда не сможет функционировать должным образом из-за расходящейся расширяющейся мощности через Bids и Orders.

Если вы все еще хотите попробовать, здесь является отправной точкой для трех соединения таблиц:

SELECT * FROM products 
LEFT JOIN bids ON products.id = bids.item 
LEFT JOIN orders ON products.id = orders.product 

Левые присоединяется обеспечит вам получить все записи продукта. Проблема с этим, с точки зрения мощности, заключается в том, что вы получите слишком много строк для каждого продукта (количество ставок для каждого продукта, умноженное на количество заказов для этого продукта).

+0

Гипотетически, если бы я хотел присоединиться ко всем трем, что мне нужно, чтобы сделать свой общий ключ, на данный момент products.id, bids.product и orders.product все одинаковы. –

+0

Хорошо, см. Мой обновленный ответ. Я исправил некоторые вещи и попытался более четко понять, почему соединение будет проблемой. Также указаны внутренние соединения, если вы хотите удостовериться, что вернетесь к каждой записи продукта. – gknicker

0

Поскольку у меня недостаточно комментариев, чтобы прокомментировать ответ gknicker, я вынужден предоставить отдельный ответ. Я собирался предложить использовать LEFT JOIN в качестве решения, но, учитывая уже описанные проблемы, вы также можете в качестве последнего средства добавить новое поле в таблицу базы данных, что упростит объединение таблиц, с которыми вы столкнулись, и соответственно установите внешние ключи.

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