sql 질문입니다! 여러개의 글 변환..

lacovnk의 이미지

드루팔에서 블로그를 포럼 글로 바꾸는 과정에서, 다음과 같이 DB를 건드릴 일이 있습니다.

일단 과정은 알아낸 것 같은데, 이를 sql로 표현하는 것이 어렵군요.

주어지는 값 : category# / forum#

0. find target
select n.nid,vid from node as n,term_node as t where n.nid=t.nid and t.tid={category#}

for each result,

1. change type
update node set type='forum' where nid={current nid}

2. add forum info to forum table
insert into forum values ({current nid},{current vid},{forum#});
// forum의 tid는 forum의 번호입니다. (forum/6이면 6..)

3. add forum info to term_data
insert into term_node values ({current nid},{forum#});

이런 작업을 해야 하는데, 이를 php으로 결과를 받아서 이러쿵저러쿵하기는 양도 많고 번거로운 것 같아, SQL만으로 해결하려고 합니다.

다음과 같이 짰는데, mysql의 서브쿼리 제한에도 걸리고.. 더 잘 짤 수 있을 것 같은데 도와주세요 ㅠㅠ

{category#} = 4
{forum#} = 6 이라고 할때 다음과 같이 짰는데, 실제 MySQL4.1에서는 subquery 제약으로 insert와 update는 되지 않는 것 같습니다.

SELECT nid,vid,4 FROM node WHERE type='blog' AND nid IN (SELECT nid FROM term_node WHERE tid=4);
INSERT INTO forum VALUES (SELECT nid,vid,6 FROM node WHERE type='blog' AND nid IN (SELECT nid FROM term_node WHERE tid=4));
INSERT INTO term_node VALUES (SELECT nid,6 FROM node WHERE type='blog' AND nid IN (SELECT nid FROM term_node WHERE tid=4));
UPDATE node SET type='forum' WHERE nid IN (SELECT nid FROM node WHERE type='blog' AND nid IN (SELECT nid FROM term_node WHERE tid=4));

음. 어떻게 하면 좋을까요?

--
http://home.lacovnk.net/

atie의 이미지

위의 sql만으로 한다는 것이 동작의 성패 여부를 떠나, SELECT를 저렇게 쓰는 것 자체만으로도 방향을 잘못 잡은 듯 합니다. 0부터 3까지로 요약한 방법에서 자료를 읽는 건 수와 하고자 하는 sql 구문에 의한 자료의 읽는 건 수를 비교해 보시면 방향을 다시 생각하는 것이 좋을 듯 합니다.
----
I paint objects as I think them, not as I see them.
Ubuntu Dapper user / Ubuntu KoreanTeam / Lanuchpad karma 16289

----
I paint objects as I think them, not as I see them.
atie's minipage

lacovnk의 이미지

어떻게 접근하면 좋을까요? SELECT를 저렇게 쓴다는 것은, 한 번만 사용되는 내용을 여러차례 쿼리를 한다는 점이 맞나요?

고급언어를 사용하면 좋겠는데.. python을 이용한다거나.. 그 쪽은 제가 잘 몰라서 도와주시면 감사하겠습니다.

sql로만 하려는 이유는. 고급언어를 사용하게 되면 최초 쿼리 결과를 메모리로 받아올 텐데 여기에서 오류가 나지 않을까 걱정했기 때문입니다. sql의 경우 그런 경우를 알아서 처리를 해주겠지만..

권순선의 이미지

이 문제는 현재 kldp에서 바로 일어나고 있는 문제를 해결하기 위한 내용입니다. 목적은 예를 들어 현재 블로그로 분류되어 있는 노드들을 모두 포럼 게시판의 적절한 곳으로 옮기는 것입니다. 예를 들어 현재 블로그로 분류되어 있는 노드들 중에서 '뉴스' 카테고리로 분류되는 노드들을 모두 '뉴스 / 새소식' 포럼(게시판)으로 옮기기 위한 것입니다. 혹 방법을 아시는 분이 계시면 도움 부탁드리겠습니다.

감사합니다... 아울러 살펴봐 주시고 이렇게 글까지 올려서 확인해봐 주고 계신 lacovnk님께도 특별히 감사의 말씀을 드립니다. 위의 쿼리는 원래 오늘 해 보려고 했던 것인데 시간이 없어서 못해 봤습니다. 내일(화요일) 저녁쯤에 시간을 내서 확인해 보겠습니다. 물론 그전에 다른 좋은 방법이 나오면 더 좋겠고요...

1day1의 이미지

mysql 의 제약때문에 sql 만으로는 어려울 것 같네요.

F/OSS 가 함께하길.. (F/OSS서포터즈,F/OSS서포터즈그룹)

F/OSS 가 함께하길..

lacovnk의 이미지

다음과 같이 해결하려고 합니다.

import MySQLdb
# variable
num_category = 4
num_forum = 6
 
# db info
db_host = 'localhost'
db_user = ''
db_passwd = ''
db_name = ''
 
db = MySQLdb.connect(host=db_host,user=db_user,passwd=db_passwd,db=db_name)
cursor = db.cursor()
line = cursor.execute("SELECT nid,vid FROM node WHERE type='blog' AND nid IN (SELECT nid FROM term_node WHERE tid='%d');" % (num_forum))
 
print 'Total Target : %d line' % (line)
cur = cursor.fetchone()
while cur != None:
        cursor.execute("INSERT INTO forum VALUES ('%d','%d','%d');" % (cur[0],cur[1],num_forum))
        cursor.execute("INSERT INTO term_node VALUES ('%d','%d');" % (cur[0],num_forum))
        cursor.execute("UPDATE node SET type='forum' WHERE nid='%d';" % (cur[0]))
        cur = cursor.fetchone()
print 'Done'
db.close()

파이썬 마을에도 올려두었습니다.
http://bbs.python.or.kr/viewtopic.php?t=22054

어떤 방법이 또 있을까요?

권순선의 이미지

kldp 서버의 사정상 php를 사용하여야 하는데 혹시 이 코드를 php로 변환해 주실 분 안계신가요~~

lacovnk의 이미지

$db_host = 'localhost';
$db_user = '';
$db_passwd = '';
$db_name = '';

$num_category = 4;
$num_forum = 6;

$db = mysql_connect($db_host,$db_user,$db_passwd);
mysql_select_db($db_name,$db);

$result = mysql_unbuffered_query("SELECT nid,vid FROM node WHERE
type='blog' AND nid IN (SELECT nid FROM term_node WHERE
tid='{$num_forum}');");
while($cur = mysql_fetch_row($result))
{
mysql_query("INSERT INTO forum VALUES
('{$cur[0]}','{$cur[1]}','{$num_forum}');");
mysql_query("INSERT INTO term_node VALUES
('{$cur[0]}','{$num_forum}');");
mysql_query("UPDATE node SET type='forum' WHERE nid='{$cur[0]}';");
}
mysql_close($db);

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.