MYSQL этот JOIN слишком многословен или это единственный способ? сортировка не работает

0

Я работаю над проектом с использованием процедурного PHP и phpmyadmin с движком InnoDB. Я не разработчик, не профессионал, я просто люблю веселиться с PHP, поэтому имейте это в виду, если я скажу что-то не так (или если вы хотите предложить мне использовать объектно-ориентированный PHP) :).
У меня есть что-то вроде этого (просто и пример, на самом деле у меня много связанных таблиц и полей):

request(id, customer_id, field1, contact_id, field2)
customer(id, customer)
contact(id, contact)

Мне нужно вернуть строку id = 1 в таблице "request" со ссылочными значениями (не с номерами id), поэтому мой результат должен быть таким: "Company X", value1, value2, "John".

Я могу получить это с:

SELECT * FROM (
    (
    SELECT customer.customer
    FROM customer
    JOIN request ON customer.id=request.customer_id
    WHERE request.id=1
    ) as result1
    JOIN 
    (
    SELECT request.field1, request.field2
    FROM request
    WHERE request.id=1
    ) as result2
    JOIN 
    (
    SELECT contact.contact
    FROM contact
    JOIN request ON contact.id=request.contact_id
    WHERE request.id=1
    ) as result3
)

(Я не знаю, смогу ли я опустить псевдонимы "resultX", но с phpmyadmin мне нужно иметь их, если нет, я получаю ошибку).

Теперь мои вопросы:

1- Это работает, но я чувствую, что это неправильный способ написания кода, я думаю, что это может быть достигнуто лучше/умнее и с меньшим количеством кода, но я не знаю как.
2- Как я могу перечислить результаты в другом порядке? Нравится: field2,customer,contact,field1? Я попытался разделить field1, field2 SELECT и изменить порядок в первой строке следующим образом:

SELECT result2,result1,result4,result3 FROM (
    (
    SELECT customer.customer
    FROM customer
    JOIN request ON customer.id=request.customer_id
    WHERE request.id=1
    ) as result1
    JOIN 
    (
    SELECT request.field1
    FROM request
    WHERE request.id=1
    ) as result2
    JOIN
    SELECT request.field2
    FROM request
    WHERE request.id=1
    ) as result3
    JOIN 
    (
    SELECT contact.contact
    FROM contact
    JOIN request ON contact.id=request.contact_id
    WHERE request.id=1
    ) as result4
)

но он возвращает: "# 1054 - неизвестный столбец" result2 "в" списке полей ""

Надеюсь, все понятно, заранее всем спасибо и поздравляю с одной из самых полезных страниц во всем интернете :)

  • 0
    Ошибка в том, что result2 - это имя таблицы, и вы пытаетесь использовать его в качестве имени поля. Вы можете изменить псевдоним поля на другой, используя AS
Теги:
sorting
join
query-optimization

1 ответ

1

Вы можете сделать несколько объединений в одном выборе

SELECT customer.customer, request.field1, request.field2, contact.contact
FROM request 
JOIN customer ON request.customer_id = customer.id
JOIN contact  ON request.contact_id = contact.id

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

  • 0
    Я знал, что есть более простой способ, быстрый и понятный человек, спасибо
  • 0
    @erre - всякий раз, когда у вас возникает желание написать подзапрос, подумайте еще раз. Обычно проще и быстрее написать запрос другим способом. (Есть несколько исключений.)
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню