2015-11-17 2 views
3

Моя база данных MySQL содержит две таблицы: user и coupon (взаимно-однозначные отношения).Вставка в отношения «один-к-одному»

Я хотел бы выбрать всех пользователей, у которых нет купона, и создать новый (случайный и уникальный).

user TABLE: 
___________________________________ 
| id | name | coupon_id | 
----------------------------------- 
    1  John   5 
    2  Mary   (null) // Need to create one coupon. 
    3  Doe   2 
    4  Max   (null) // Need to create one coupon. 
    5  Rex   1 
    7  Bill   (null) // Need to create one coupon. 


coupon TABLE: 
______________________________________________ 
| id | code (random 6-chars - unique) | 
---------------------------------------------- 
    1  80k2ni 
    2  0akdne 
    5  nk03jd 

Ярлыки:

Выбрать всех пользователей без купона: SELECT * from user WHERE coupon_id IS NULL;

Создание случайного 6-символьному строку (MySQL): LEFT(sha1(rand()), 6).

+0

У меня есть ощущение, что вы должны использовать [ВСТАВИТЬ ... SELECT] (https://dev.mysql.com/doc/refman/5.6/en/insert-select.html), хотя на самом деле у меня нет настройки для написания макетного запроса на данный момент –

+0

@ Memor-X Спасибо за попытку помочь, но я не понял, как заставить его работать. Пожалуйста, напишите его, когда у вас есть время;) –

+0

'SELECT u.is, u.name, COALESCE (u.coupon_id, LEFT (sha1 (rand()), 6)) FROM user u LEFT JOIN coupon c on u.coupon_id = c.id' Может быть, вы хотите, чтобы этот запрос был не очень ясным. – Mihai

ответ

2

Предполагая, что вы не против продолжения вверх от 6 для следующего coupon_id, это может быть сделано следующим образом (см SQL Fiddle Demo):

-- Declare and set variables 
SET @id_for_insert = (SELECT MAX(`id`) FROM `coupon`); 
SET @id_for_update = @id_for_insert; 

-- Insert new coupons 
INSERT INTO `coupon` (id, code) 
SELECT @id_for_insert := @id_for_insert + 1, LEFT(SHA1(RAND()), 6) 
FROM `user` 
WHERE coupon_id IS NULL; 

-- Update users that don't already have a coupon with the newly created coupons 
UPDATE `user` 
SET coupon_id = @id_for_update := @id_for_update + 1 
WHERE coupon_id IS NULL; 
+0

Удивительно! Отлично работает! Спасибо. –

+0

Спасибо, что сообщили мне, рад, что это помогло. –

0

Что-то вроде этого, может быть:

Insert into coupon 
select distinct id,LEFT(sha1(rand()), 6) 
from user WHERE coupon_id IS NULL 

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

+0

Извините, но я не понимаю, что вы пытаетесь объяснить. Запуск этого кода я получаю 'Колонка счетчик не соответствует счету значения в строке 1'. –

+0

Мой код основан исключительно на информации, предоставленной вами, и не проверен. Поэтому, если в таблице купонов есть дополнительные столбцы, вам также придется добавить их в предложение select. – Harsh

+0

Спасибо, теперь он создает записи в таблицу 'coupon'. Но как я могу вставить 'coupon_id' в таблицу' user'? –

0
//check if works inform me i will be glad 
CREATE PROCEDURE `syncCouponUser`() 
BEGIN 
    INSERT INTO coupon(id,code)//create coupons var no-used user ids 
    select 
    id, 
    LEFT(sha1(rand()) 
    from user 
    where coupon_id IS NULL ; 

    UPDATE user //add coupons from coupon table with matches 
    SET coupon_id=(
    select c.coupon_id 
    from coupon c join user u 
    on c.id=u.id); 

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