#php #mysql #sql-server #wordpress #woocommerce
#php #mysql #sql-сервер #wordpress #woocommerce
Вопрос:
Мне нужна помощь с SQL-запросом. Я хочу показать строки из моей таблицы test_related_orders, где текущий идентификатор пользователя равен идентификатору пользователя в моей таблице test_related_orders, а где order_unlock_time (из моей таблицы) — <= актуальная временная метка. Пока здесь все работает нормально. Но теперь это усложняется. Мне также нужно проверить / ограничить в моей таблице wp_posts, есть ли post_author, равный моему идентификатору пользователя test_related_orders, у которого есть существующий order_number, такой же, как у моего test_related_orders order_number .
Если это утверждение верно, будут показаны связанные строки из моего test_related_orders . Если это утверждение равно false, не должно быть связанных строк.
(Поэтому, когда я удаляю заказ в интерфейсе woocommerce, оператор не должен возвращать строку для этой записи.)
Вот мой существующий код:
$user_id = get_current_user_id();
//Timestamp for current system time
date_default_timezone_set("Europe/Berlin");
$timestamp = date("Y-m-d H:i:s");
//Database Query
$abfrage = "SELECT * FROM test_related_orders WHERE user_id = '$user_id' AND order_unlock_time <= '$timestamp'";
Я думаю, что могу использовать ВНУТРЕННЕЕ СОЕДИНЕНИЕ, и я попробовал его здесь:
INNER JOIN wp_posts ON '$user_id' = post_author WHERE....
но для меня, как для новичка, это сложно.
Вот мои структуры базы данных:
Структура test_related_orders: order_number выглядит как: DE-1016-835, а user_id — как обычное число / идентификатор, например, 1 в этом примере.
Структура базы данных wp_posts:
Последнее изображение представляет собой пример записи из wp_posts. Проблема в том, что мне нужно получить номер заказа из post_title, и для этого мне нужно удалить первое слово «Lieferschein» из этого заголовка, чтобы получить order_number, а дополнительного поля для номера нет…
Спасибо за вашу помощь! Надеюсь, я объяснил это полностью.
Ответ №1:
Первая проблема, которую нужно решить, — это получение номера заказа из post_title, чтобы вы могли сравнить значения во внутреннем соединении. Примитивный способ сделать это, предполагая, что номер заказа всегда находится в форме AA-DDDD-DDD, будет
SELECT right(post_title, 11) as posts_order_number
Как вы уже обнаружили, внутреннее соединение — это то, что вам нужно, поскольку оно будет возвращать результаты только там, где совпадают таблицы. Обратите внимание, что вы обычно объединяете таблицы на основе их столбцов, а не напрямую сравниваете с вашей строкой ‘$ user_id’ (и вы уже отфильтровали это в своем предложении where).
Вы можете объединять более одного поля одновременно, чтобы соответствовать номеру заказа, а также идентификатору пользователя.
Теперь ваш запрос становится:
SELECT *
FROM test_related_orders tro
INNER JOIN wp_posts p
ON tro.user_id = p.post_author
AND tro.order_number = right(p.post_title, 11)
WHERE tro.user_id = '$user_id' AND order_unlock_time <= '$timestamp'
Комментарии:
1. Что вы имеете в виду под tro?
2. Я думаю, я знаю, что это значит, что это псевдоним, верно?
3. да, точно, вы могли бы ввести что угодно вместо
tro
, и это не имело бы никакого значения. Вы не можете быть настолько новичком, если знаете об псевдонимах 😉4. Я получаю сообщение об ошибке, не знаю почему; o # 1064 — У вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса для использования рядом с ‘(post_title, 11) ГДЕ tro.user_id = 1 LIMIT 0, 25’ в строке 5
5. извините, это была моя ошибка, ошибка копирования и вставки! в join я перенес
SELECT
из своего первого примера кода. Теперь исправлено выше