2013-12-04 3 views
0

На мой последний вопрос был дан ответ для создания списка из двух таблиц.Дополнительные таблицы в список

SELECT CONCAT(P.LastName, ', ', P.FirstName) AS Name, MP.MembershipID, P.PersonID 
FROM `person` P 
INNER JOIN `membershipperson` MP ON MP.PersonID = P.PersonID 
ORDER BY MP.MembershipID DESC 

Теперь мне нужна помощь в добавлении в список дополнительных данных.

  1. Мне нужен список, который показывает имя, фамилия, PersonId, MemberID, LastActiveYear, MemberSince, Approved, LockedOut.

  2. код SQL установлен Утверждена бит в 0, если LastActiveYear является < 2013. Я могу хотеть использовать страницу Mysqli PHP для этого, так что я могу изменить год по мере необходимости.

Вот примеры таблиц;

person 
PersonID  LastName FirstName 
----------+------------+------------+--------- 
1212   Barr  Foo    
888    To   Go    
1415   From  Is    


Membershipperson 
MemberShipID  PersonID 
-------------+------------ 
2250   1212 
1150   888 
3500   1415 

users 
PersonID  Username IsApproved LockedOut 
----------+-------------+-----------+----------- 
1212   2250   1   1 
888   1150   1   0 
1415   3500   0   1 

membership 
MemberShipId    LastActiveYear 
---------------+------------------------ 
    ####  +   2012 

Исправленные и добавленные таблицы.

+0

Вы хотите обновить таблицу или добавить дополнительную информацию в массив php или ...? Извините, не совсем понятно, что вам нужно. –

+0

Прежде всего, мне нужно получить список тех членов, у которых есть LastActiveYear меньше 2013 года и где бит одобрен равен 1. После этого мне нужно обновить все в списке и установить бит Approved в 0. Я надеюсь, что это очищает это вверх! СПАСИБО. –

+0

@BobCooper [** См. Обновленную скрипку здесь **] (http://sqlfiddle.com/#!2/15429/2) –

ответ

0

Предполагая, что вы будете использовать PHP MySQLi

//Obviously substitute for you mysql credentials 
$mysqli_link = mysqli_connect("localhost","root","pas") or die(mysqli_error($mysqli_link)); 
//again choose the correct right db 
mysqli_select_db($mysqli_link,"database") or die (mysqli_error($mysqli_link)); 


$query = "SELECT CONCAT(P.LastName, ', ', P.FirstName) AS Name, MP.MembershipID, ms.LastActiveYear, P.PersonID as personId 
FROM `person` P 
INNER JOIN `membershipperson` MP ON MP.PersonID = P.PersonID 
LEFT JOIN `user` ON P.PersonID=users.PersonID 
LEFT JOIN `membership` ms ON MP.MemberShipID=ms.MemberShipID 
WHERE users.Approved=1 
AND ms.LastActiveYear < 2013 
ORDER BY MP.MembershipID DESC"; 

$result = mysqli_query($mysqli_link, $query); 

//To see results 
$data = array(); 
$ids = array(); 
while ($row = mysqli_fetch_assoc($result)) { 
    $data[] = $row; 
    $ids[] = $row['personId']; 

} 

echo'<pre>'; 
print_r($data); 
die('</pre>'); // this will stop the rest of the page from loading 

//loop through the results and store the `PersonID`'s in an array called `$ids` (or whatever you want to call it) 

$ids = implode(',', $ids); 
$ids = substr($ids, 0, -1); 
$query = "UPDATE users SET Approved=0 WHERE PersonID IN ($ids)"; 
mysqli_query($mysqli_link, $query); 

Надеюсь, это поможет! :)

+0

Привет, спасибо Росс, я попробовал код sql и получил ошибку, поскольку LastActiveYear не находится в таблице пользователей, она находится в таблице person. –

+0

Я положил 'P.LastActiveYear <2013' ?? Была ли ошибка с первым или вторым запросом? –

+0

Ошибка SQL-запрос: Документация ВЫБОР CONCAT (P.LastName, '', P.FirstName) как имя, MP.MembershipID, P.PersonID ОТ 'person' P INNER JOIN' membershipperson' MP ON MP. PersonID = P.PersonID LEFT JOIN 'users' ПО P.PersonID = users.PersonID ГДЕ users.Approved = 1 И P.LastActiveYear <2013 ORDER BY DESC MP.MembershipID LIMIT 0, 30 MySQL сказал: Документация # 1054 - Неизвестный столбец P.LastActiveYear в 'where clause' –

0

Я предполагаю, что вы просили

  • мне нужен список, который показывает имя, фамилия, PersonId, MemberID, LastActiveYear, MemberSince, Approved, LockedOut.From комментарии мне нужно, чтобы получить список тех членов которые имеют LastActiveYear менее 2013 и где Утверждена бит 1

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

SELECT 
p.LastName, 
p.FirstName, 
p.PersonID, 
m.MemberID, 
p.LastActiveYear, 
p.MemberSince, 
u.Approved, 
u.LockedOut 
FROM person p 
INNER JOIN Membershipperson m ON(m.PersonID = p.PersonID) 
INNER JOIN users u ON(u.PersonID = u.PersonID) 
INNER JOIN membership ms ON(ms.MembershipId = m.MemberID) 
WHERE ms.LastActiveYear < '2013' 
AND u.Approved =1 
GROUP BY u.PersonID 

Во-вторых вы просили

  • SQL код набора Approved бит 0, если LastActiveYear является < 2013. Я могу хотеть использовать страницу Mysqli PHP для этого, так что я могу изменить год по мере необходимости.

То же, что присоединиться к вашей таблицы в запросе обновлений и набор Одобрено к 0

UPDATE users u 
INNER JOIN Membershipperson m ON(m.PersonID = u.PersonID) 
INNER JOIN person p ON(p.PersonID = u.PersonID) 
INNER JOIN membership ms ON(ms.MembershipId = m.MemberID) 
SET u.Approved = 0 
WHERE ms.LastActiveYear < '2013' 

See Fiddle Updated Fiddle

+0

Привет ... и спасибо за ответ. Я попробовал первый код и получил сообщение об ошибке «Членство» не существует сначала INNER JOIN. Нужно ли добавлять что-то к «члену-члену» для идентификации? –

+0

У вас есть таблица с именем 'Membershipperson'? если нет, то поместите правильное имя таблицы в запрос, который содержит реальность как для пользователей, так и для людей. –

+0

ОК да есть таблица с этим именем, (Membershipperson). Она имеет перекрестные ссылки для номеров PersonID и MembershipID. –

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